From 010eae6bd7b57c5d90f3b4f0c28a91c027ce23b4 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 9 Dec 2024 18:32:09 +0800 Subject: [PATCH 01/22] =?UTF-8?q?fix=20=E6=9D=83=E9=99=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=94=9F=E6=88=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionsController.cs | 17 +- .../Device/Dtos/UserTenantDeviceCodeDto.cs | 30 +- .../Filters/AssignPermissionLimitAttribute.cs | 20 +- .../Device/PermissionAnalyzeConstants.cs | 18 + .../Request/DevicePermissionSaveRequest.cs | 2 + .../IDevicePermissionAnalyzeService.cs | 26 + .../Services/IDevicePermissionService.cs | 20 - .../Services/IPermissionAnalyzeService.cs | 8 + .../BasePermissionAnalyzeService.cs | 226 +++++ .../Services/Implements/DeviceGroupService.cs | 8 +- .../DevicePermissionAnalyzeService.cs | 855 ++++++++++++++++++ .../Implements/DevicePermissionService.cs | 820 +---------------- .../DepartmentPermissionAnalyzeService.cs | 28 + .../GroupPermissionAnalyzeService.cs | 27 + .../TenantPermissionAnalyzeService.cs | 18 + .../UserPermissionAnalyzeService.cs | 16 + .../Services/Implements/GainfoGroupService.cs | 8 +- .../Implements/GainfoPermissionService.cs | 22 +- .../Implements/GainfoUpdateService.cs | 12 +- Src/Dlhis.Basic/ParallelExtensions.cs | 9 + Src/Dlhis.Basic/RecursionHelper.cs | 109 +++ 21 files changed, 1419 insertions(+), 880 deletions(-) create mode 100644 Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs create mode 100644 Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/UserPermissionAnalyzeService.cs create mode 100644 Src/Dlhis.Basic/ParallelExtensions.cs create mode 100644 Src/Dlhis.Basic/RecursionHelper.cs diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index d0f468c4..d42822b9 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -17,10 +17,12 @@ namespace Dlhis.Basic.Device.Controllers; public class DevicePermissionsController : ControllerBase { private readonly IDevicePermissionService _devicePermissionService; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; - public DevicePermissionsController(IDevicePermissionService devicePermissionService) + public DevicePermissionsController(IDevicePermissionService devicePermissionService, IDevicePermissionAnalyzeService devicePermissionAnalyzeService) { _devicePermissionService = devicePermissionService; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; } /// @@ -67,7 +69,7 @@ public class DevicePermissionsController : ControllerBase [HttpGet("assignments")] public async Task> GetAssignmentsAsync([FromQuery] DeviceGetAssignmentsRequest request) { - return await _devicePermissionService.GetAssignmentsAsync(request); + return await _devicePermissionAnalyzeService.GetAssignmentsAsync(request); } /// @@ -78,7 +80,7 @@ public class DevicePermissionsController : ControllerBase [HttpGet("assignments-unique")] public async Task> GetAssignmentUniqueAsync([FromQuery] DeviceGetAssignmentUniquesRequest request) { - return await _devicePermissionService.GetAssignmentUniqueAsync(request); + return await _devicePermissionAnalyzeService.GetAssignmentUniqueAsync(request); } /// @@ -114,13 +116,4 @@ public class DevicePermissionsController : ControllerBase { return await _devicePermissionService.GetUserDevicePermissionsAsync(code); } - - - [AllowAnonymous] - [HttpGet("test2")] - [IgnoreTenant] - public async Task GetUserDevicePermissions2Async() - { - await _devicePermissionService.GetUserDevicePermissions2Async(); - } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs b/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs index 688e5e53..52065902 100644 --- a/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs +++ b/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs @@ -1,4 +1,6 @@ -namespace Dlhis.Basic.Device.Dtos; +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Basic.Device.Dtos; public class UserTenantDeviceCodeDto { @@ -12,3 +14,29 @@ public class UserTenantDeviceCodeDto /// public IEnumerable Codes { get; set; } } + +public class TenantAssignTypeDeviceCode +{ + /// + /// 租户 + /// + public string Tenant { get; set; } + + /// + /// 设备权限 + /// + public IEnumerable Codes { get; set; } +} + +public class AssignTypeDeviceCode +{ + /// + /// 分配类型 + /// + public AssignTypeEnumType AssignType { get; set; } + + /// + /// 设备权限 + /// + public IEnumerable Codes { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs index 348b430c..fa96d0d8 100644 --- a/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs +++ b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs @@ -10,22 +10,14 @@ public class AssignPermissionLimitAttribute : Attribute, IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { - //10966 55184 var currentUser = context.HttpContext.RequestServices.GetRequiredService(); - var userId = currentUser.GetIntSubjectId(); - if (userId is 10966 or 55184) - { - await next(); - } - else - { - var redisCache = context.HttpContext.RequestServices.GetRequiredService(); + //var userId = currentUser.GetIntSubjectId(); + var redisCache = context.HttpContext.RequestServices.GetRequiredService(); - var currentTenantId = currentUser.GetStringTenantId(); + var currentTenantId = currentUser.GetStringTenantId(); - await using var handler = await redisCache.LockAsync($"permission:generate:{currentTenantId}"); - handler.Acquired.ThrowIfFalse("请勿频繁分配"); - await next(); - } + await using var handler = await redisCache.LockAsync($"permission:generate:{currentTenantId}"); + handler.Acquired.ThrowIfFalse("请勿频繁分配"); + await next(); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs b/Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs new file mode 100644 index 00000000..6f0e1221 --- /dev/null +++ b/Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs @@ -0,0 +1,18 @@ +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Basic.Device; + +public class PermissionAnalyzeConstants +{ + private const string _verb = "PermissionAnalyze"; + public const string User = nameof(AssignTypeEnumType.User) + _verb; + public const string Group = nameof(AssignTypeEnumType.Group) + _verb; + public const string Department = nameof(AssignTypeEnumType.Department) + _verb; + public const string Tenant = nameof(AssignTypeEnumType.Tenant) + _verb; + + + public static string GetTypeName(AssignTypeEnumType assignTypeEnumType) + { + return assignTypeEnumType + _verb; + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs index 572f9c30..067b7d5f 100644 --- a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs @@ -1,5 +1,7 @@ using System.ComponentModel.DataAnnotations; +using System.Linq.Expressions; using Dlhis.Entity.Device.Enums; +using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; using Kurisu.AspNetCore.Utils.Extensions; diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs new file mode 100644 index 00000000..43b4ea4a --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs @@ -0,0 +1,26 @@ +using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Response; +using Dlhis.Basic.Organization.Dto; +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Basic.Device.Services; + +/// +/// 权限数据分析 +/// +public interface IDevicePermissionAnalyzeService : IScopeDependency +{ + Task GenerateDeviceTasksAsync(Func func, List userNos); + + Task>> GetAssignDeviceCodesInternalAsync(List userNos); + + Task>> GetAssignDeviceCodesInternalAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes); + + Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request); + + Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request); + + + Task> GetAssignDeviceCodesAsync(string userCode); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 1f118f91..10ac7f8a 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -26,29 +26,9 @@ public interface IDevicePermissionService : IScopeDependency Task AssignToUniqueImportAsync(IFormFile file); - /// - /// 获取分配的权限 - /// - /// - Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request); - - - Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request); Task>> GetUserDevicePermissionsAsync(string code); - - Task GetUserDevicePermissions2Async(); - - /// - /// 生成下发任务 - /// - /// - /// - /// - Task GenerateDeviceTasksAsync(Func func, List userNos); - - /// /// 生成下发任务(主动生成) /// diff --git a/Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs new file mode 100644 index 00000000..c2806f9e --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs @@ -0,0 +1,8 @@ +using Dlhis.Basic.Device.Request; + +namespace Dlhis.Basic.Device.Services; + +public interface IPermissionAnalyzeService +{ + Task AnalyzeAsync(DevicePermissionSaveRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs new file mode 100644 index 00000000..c48916ee --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -0,0 +1,226 @@ +using Dlhis.Basic.DataPermissions; +using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.Request; +using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Device.Enums; +using Dlhis.Entity.Sys.Entities; +using Dlhis.Entity.Sys.Enums; +using Kurisu.AspNetCore.Authentication.Abstractions; +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; + +public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService +{ + private readonly ICurrentUser _currentUser; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; + private readonly IMyDataPermissionService _myDataPermissionService; + protected IDbContext DbContext { get; } + + protected BasePermissionAnalyzeService(IServiceProvider serviceProvider) + { + _currentUser = serviceProvider.GetService(); + _devicePermissionAnalyzeService = serviceProvider.GetService(); + _myDataPermissionService = serviceProvider.GetService(); + DbContext = serviceProvider.GetService(); + CurrentTenantId = _currentUser.GetStringTenantId(); + } + + private string CurrentTenantId { get; } + + public ISugarQueryable DevicePermission => DbContext.Queryable(); + + + public async Task AnalyzeAsync(DevicePermissionSaveRequest request) + { + var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; + + await CheckAssignTopDoorDeviceGroupAsync(request); + + var dps = await GetAssignedDevicePermissionsAsync(request); + + (List codesToAdd, List codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes); + if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty()) + { + return; + } + + var devicesToAdd = await DbContext.Queryable().Where(x => codesToAdd.Contains(x.Code)).Distinct().ToListAsync(); + var devicesToDelete = await DbContext.Queryable().Where(x => codesToDelete.Contains(x.Code)).Distinct().ToListAsync(); + + var gainfoNos = await GetGainfoNosAsync(currentAssignValue); + + var userTenantDeviceCodes = + devicesToDelete.IsPresent() && request.AssignType != AssignTypeEnumType.Tenant + ? await _devicePermissionAnalyzeService.GetAssignDeviceCodesInternalAsync(gainfoNos, request.AssignType) + : new Dictionary>(); + + var tasks = new List(); + foreach (var gainfoNo in gainfoNos) + { + 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()); + + if (userTenantDeviceCodes.Any()) + { + var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.Codes).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, + 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 ChunkInsertAsync(tasks); + await PersistDataAsync(dps, request); + } + + private async Task ChunkInsertAsync(List batch) where T : class, new() + { + foreach (var tasks in batch.Chunk(500)) + { + await DbContext.InsertAsync(tasks); + } + } + + /// + /// 获取分配当前类型关联的用户 + /// + /// + /// + protected abstract Task> GetGainfoNosAsync(string assignValue); + + + // --------------------------------------------------------------------------------------------------------------------- // + + private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request) + { + if (request.UniqueType == DeviceAssignmentTypeEnumType.Group) + { + await Scoped.Temp.Value.CreateAsync(async sp => + { + var currentDb = sp.GetService(); + await currentDb.IgnoreAsync(async () => + { + var dgs = await currentDb.Queryable().Where(x => request.Codes.Contains(x.Code)).ToListAsync(); + dgs.Any(x => x.TenantId.IsEmpty()).ThrowIfTrue("不可分配顶级分组节点"); + }); + }); + } + } + + + private async Task PersistDataAsync(List dps, DevicePermissionSaveRequest request) + { + await DbContext.DeleteAsync(dps); + //保存配置的权限 + if (request.Codes.IsPresent()) + { + var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; + var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity + { + AssignType = request.AssignType, + AssignValue = currentAssignValue, + UniqueType = request.UniqueType, + UniqueValue = code, + Type = request.Type, + TenantId = CurrentTenantId + }).ToList(); + + await DbContext.InsertAsync(devicePermissions); + } + } + + private List GetMyUniqueValues(DeviceAssignmentTypeEnumType uniqueType) + { + var searchAll = _currentUser.GetRole() is "admin" or "tenant-admin"; + //_myDataPermissionService + if (!searchAll && uniqueType == DeviceAssignmentTypeEnumType.Device) + { + return _myDataPermissionService.GetMyDeviceCodes(); + } + + return new List(); + } + + private async Task> GetAssignedDevicePermissionsAsync(DevicePermissionSaveRequest request) + { + var myData = GetMyUniqueValues(request.UniqueType); + + var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; + return await DevicePermission.Where(x => x.AssignType == request.AssignType + && x.AssignValue == currentAssignValue + && x.UniqueType == request.UniqueType + && x.Type == request.Type + && x.TenantId == CurrentTenantId) + .WhereIF(myData.Any(), x => myData.Contains(x.UniqueValue)) + .ToListAsync(); + } + + private async Task<(List, List)> GetDiffAsync(DeviceAssignmentTypeEnumType type, List dps, List uniqueValues) + { + var beforeCodes = dps.Select(x => x.UniqueValue).ToList(); + var presentCodes = uniqueValues.IsPresent() ? uniqueValues : new List(); + + if (type == DeviceAssignmentTypeEnumType.Group) + { + var deviceGroups = await DbContext.Queryable().ToListAsync(); + beforeCodes = await GetDeviceCodeByGroupAsync(deviceGroups, beforeCodes); + presentCodes = await GetDeviceCodeByGroupAsync(deviceGroups, presentCodes); + } + + var codesToAdd = presentCodes.Except(beforeCodes).ToList(); + var codesToDelete = beforeCodes.Except(presentCodes).ToList(); + + return (codesToAdd, codesToDelete); + } + + + private async Task> GetDeviceCodeByGroupAsync(List deviceGroups, List codes) + { + var result = new List(); + foreach (var groupCode in codes) + { + result.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(groupCode, deviceGroups)); + } + + result = result.Distinct().ToList(); + + return await DbContext.Queryable() + .Where(x => result.Contains(x.GroupCode)) + .Select(x => x.DeviceCode) + .Distinct() + .ToListAsync(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index 7770d0cc..a123326e 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -14,18 +14,18 @@ namespace Dlhis.Basic.Device.Services.Implements; public class DeviceGroupService : IDeviceGroupService { private readonly IDbContext _dbContext; - private readonly IDevicePermissionService _devicePermissionService; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly ICurrentUser _currentUser; private readonly ITenantApi _tenantApi; private readonly IParallelService _parallelService; public DeviceGroupService(IDbContext dbContext, - IDevicePermissionService devicePermissionService, + IDevicePermissionAnalyzeService devicePermissionAnalyzeService, ICurrentUser currentUser, ITenantApi tenantApi, IParallelService parallelService) { _dbContext = dbContext; - _devicePermissionService = devicePermissionService; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; _currentUser = currentUser; _tenantApi = tenantApi; _parallelService = parallelService; @@ -107,7 +107,7 @@ public class DeviceGroupService : IDeviceGroupService _parallelService.Enable = true; //下发任务 - await _devicePermissionService.GenerateDeviceTasksAsync(async () => + await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => { var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); await _dbContext.DeleteAsync(relationships); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs new file mode 100644 index 00000000..03267ad4 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -0,0 +1,855 @@ +using System.Collections.Concurrent; +using System.Runtime.CompilerServices; +using Dlhis.Basic.DataPermissions; +using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Response; +using Dlhis.Basic.Organization.Dto; +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; +using Dlhis.Entity.Sys.Enums; +using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; +using Kurisu.AspNetCore.Utils.Extensions; +using SqlSugar; + +namespace Dlhis.Basic.Device.Services.Implements; + +public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService +{ + private readonly IDbContext _dbContext; + private readonly IParallelService _parallelService; + private readonly ICurrentUser _currentUser; + private readonly ILogger _logger; + private readonly IMyDataPermissionService _myDataPermissionService; + + public DevicePermissionAnalyzeService(IDbContext dbContext, + IParallelService parallelService, + ICurrentUser currentUser, + IMyDataPermissionService myDataPermissionService, + ILogger logger) + { + _dbContext = dbContext; + _parallelService = parallelService; + _currentUser = currentUser; + _logger = logger; + _myDataPermissionService = myDataPermissionService; + } + + public async Task GenerateDeviceTasksAsync(Func func, List userNos) + { + var getAllUser = userNos.IsEmpty(); + + //获取所有人的权限 + if (getAllUser) + userNos = await GetPermissionUserNosAsync(); + + var before = await GetAssignDeviceCodesInternalAsync(userNos); + + //业务处理 + _dbContext.Client.QueryFilter.Restore(); + await func(); + _dbContext.Client.QueryFilter.ClearAndBackup(); + + //获取业务处理后所有人的权限 + if (getAllUser) + { + var nextUserNos = await GetPermissionUserNosAsync(); + if (nextUserNos.Any()) + userNos = userNos.Concat(nextUserNos).Distinct().ToList(); + } + + var current = await GetAssignDeviceCodesInternalAsync(userNos); + + var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); + + var waitAddTasks = new List(); + var waitDeleteTasks = new List(); + + foreach (var userNo in userNos) + { + before.TryGetValue(userNo, out var beforeTenantDeviceCodes); + beforeTenantDeviceCodes ??= new List(); + current.TryGetValue(userNo, out var currentTenantDeviceCodes); + currentTenantDeviceCodes ??= new List(); + + var tenants = new HashSet(); + foreach (var item in beforeTenantDeviceCodes) + tenants.Add(item.Tenant); + foreach (var item in currentTenantDeviceCodes) + tenants.Add(item.Tenant); + + foreach (var tenant in tenants) + { + var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); + var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); + + //被删除 + var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList(); + //新增 + var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList(); + + if (!deletedItems.Any() && !addItems.Any()) + { + continue; + } + + var deviceCodes = devices.Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).Select(x => x.Code).ToList(); + deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList(); + addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList(); + + //下发任务创建 + deletedItems.ForEach(x => waitDeleteTasks.Add(new DeviceTaskEntity + { + DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Type = DeviceTaskEnumType.Delete, + CancellationId = 0, + DeviceType = devices.First(item => item.Code == x).Type, + UserNo = userNo, + Version = 0, + TenantId = tenant, + Source = DeviceTaskSourceEnumType.Manually + })); + + addItems.ForEach(x => waitAddTasks.Add(new DeviceTaskEntity + { + DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Type = DeviceTaskEnumType.Add, + DeviceType = devices.First(item => item.Code == x).Type, + UserNo = userNo, + Version = 0, + TenantId = tenant, + Source = DeviceTaskSourceEnumType.Manually + })); + } + } + + await ChunkInsertAsync(waitAddTasks); + await ChunkInsertAsync(waitDeleteTasks); + + return new DevicePermissionAssignResponse + { + AddCount = waitAddTasks.Count, + DeleteCount = waitDeleteTasks.Count + }; + } + + + public async Task GenerateDeviceTasksV2Async(Func func, List userNos) + { + var before = await GetAssignDeviceCodesInternalAsync(userNos); + //业务处理 + await _dbContext.IgnoreAsync(async () => { await func(); }); + + var current = await GetAssignDeviceCodesInternalAsync(userNos); + + var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); + + var waitAddTasks = new List(); + var waitDeleteTasks = new List(); + + foreach (var userNo in userNos) + { + before.TryGetValue(userNo, out var beforeTenantDeviceCodes); + beforeTenantDeviceCodes ??= new List(0); + current.TryGetValue(userNo, out var currentTenantDeviceCodes); + currentTenantDeviceCodes ??= new List(0); + + var tenants = new HashSet(); + foreach (var item in beforeTenantDeviceCodes) + tenants.Add(item.Tenant); + foreach (var item in currentTenantDeviceCodes) + tenants.Add(item.Tenant); + + foreach (var tenant in tenants) + { + var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); + var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); + + var addItems = currentCodes.Except(beforeCodes).ToList(); + var deletedItems = beforeCodes.Except(currentCodes).ToList(); + + if (!deletedItems.Any() && !addItems.Any()) + { + continue; + } + + //下发任务创建 + deletedItems.ForEach(x => waitDeleteTasks.Add(new DeviceTaskEntity + { + DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Type = DeviceTaskEnumType.Delete, + CancellationId = 0, + DeviceType = devices.First(item => item.Code == x).Type, + UserNo = userNo, + Version = 0, + TenantId = tenant, + Source = DeviceTaskSourceEnumType.Manually + })); + + addItems.ForEach(x => waitAddTasks.Add(new DeviceTaskEntity + { + DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Type = DeviceTaskEnumType.Add, + DeviceType = devices.First(item => item.Code == x).Type, + UserNo = userNo, + Version = 0, + TenantId = tenant, + Source = DeviceTaskSourceEnumType.Manually + })); + } + } + + await ChunkInsertAsync(waitAddTasks); + await ChunkInsertAsync(waitDeleteTasks); + + return new DevicePermissionAssignResponse + { + AddCount = waitAddTasks.Count, + DeleteCount = waitDeleteTasks.Count + }; + } + + private async Task ChunkInsertAsync(List batch) where T : class, new() + { + foreach (var tasks in batch.Chunk(500)) + { + await _dbContext.InsertAsync(tasks.ToList()); + } + } + + + public async Task>> GetAssignDeviceCodesInternalAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes) + { + var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); + if (!gainfos.Any()) + { + return new Dictionary>(); + } + + var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); + + var enableFactoryPermissions = await _dbContext.Queryable().ToListAsync(); + + 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 deviceGroups = await _dbContext.Queryable().ToListAsync(); + var deviceRelationships = await _dbContext.Queryable().ToListAsync(); + var departments = await _dbContext.Queryable().ToListAsync(); + + var result = new ConcurrentDictionary>(); + //var total = gainfos.Count; + + gainfos.ParallelForEach(gainfo => + { + var gainfoDto = new GainfoDto + { + Id = gainfo.Id, + No = gainfo.No, + Code = gainfo.Code, + Name = gainfo.Name, + Workplace = gainfo.Workplace, + Factory = gainfo.Factory, + DepartmentNo = gainfo.DepartmentNo, + IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, + EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true + }; + + var codes = GetAssignDeviceCodesInternal2(gainfoDto, gainfoGroups, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, devices, departments, ignoreAssignTypes); + result.TryAdd(gainfo.No, codes); + + // Interlocked.Decrement(ref total); + // _logger.LogInformation("剩余:{count}", total); + }); + + return result.ToDictionary(x => x.Key, x => x.Value); + } + + + public async Task>> GetAssignDeviceCodesInternalAsync(List userNos) + { + var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); + var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList(); + var registries = await _dbContext.Queryable() + .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) + .Where(x => !SqlFunc.IsNullOrEmpty(x.BusinessPlaceCode)) + .ToListAsync(); + + var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); + if (!gainfos.Any()) + { + return new Dictionary>(); + } + + var enableFactoryPermissions = await _dbContext.Queryable().ToListAsync(); + + var gainfoGroupRelationships = await _dbContext.Queryable().Where(x => userNos.Contains(x.UserNo)).ToListAsync(); + var devicePermissions = await _dbContext.Queryable().ToListAsync(); + var deviceGroups = await _dbContext.Queryable().ToListAsync(); + var deviceRelationships = await _dbContext.Queryable().ToListAsync(); + var departments = await _dbContext.Queryable().ToListAsync(); + + if (_parallelService.Enable) + { + var result = new ConcurrentDictionary>(); + var total = gainfos.Count; + Parallel.ForEach(gainfos, new ParallelOptions { MaxDegreeOfParallelism = 4 }, gainfo => + { + var gainfoDto = new GainfoDto + { + Id = gainfo.Id, + No = gainfo.No, + Code = gainfo.Code, + Name = gainfo.Name, + Workplace = gainfo.Workplace, + Factory = gainfo.Factory, + DepartmentNo = gainfo.DepartmentNo, + IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, + EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true + }; + + var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); + result.TryAdd(gainfo.No, codes); + + Interlocked.Decrement(ref total); + _logger.LogInformation("剩余:{count}", total); + }); + + return result.ToDictionary(x => x.Key, x => x.Value); + } + else + { + var result = new Dictionary>(); + var total = gainfos.Count; + foreach (var gainfo in gainfos) + { + var gainfoDto = new GainfoDto + { + Id = gainfo.Id, + No = gainfo.No, + Code = gainfo.Code, + Name = gainfo.Name, + Workplace = gainfo.Workplace, + Factory = gainfo.Factory, + DepartmentNo = gainfo.DepartmentNo, + IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, + EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true + }; + + var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); + result.Add(gainfo.No, codes); + total--; + _logger.LogInformation("剩余:{count}", total); + } + + return result; + } + } + + public async Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request) + { + request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; + var role = _currentUser.GetRole(); + var isAll = role is "admin" or "tenant-admin"; + var deviceCodes = _myDataPermissionService.GetMyDeviceCodes(); + + return await _dbContext.Queryable() + .Where(x => x.AssignType == request.AssignType) + .Where(x => x.AssignValue == request.AssignValue) + .Where(x => x.UniqueType == request.UniqueType) + .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) + .Where(x => x.Type == request.Type) + .Select(x => x.UniqueValue) + .ToListAsync(); + } + + public async Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request) + { + var nos = await _dbContext.Queryable() + .Where(x => x.UniqueType == request.UniqueType) + .Where(x => x.UniqueValue == request.UniqueValue) + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.Type == request.Type) + .Select(x => x.AssignValue) + .ToListAsync(); + + return await _dbContext.Queryable().Where(x => nos.Contains(x.No)).Select(x => new GainfoDto + { + Id = x.Id, + Code = x.Code, + Name = x.Name, + Workplace = x.Workplace, + Factory = x.Factory + }).ToListAsync(); + } + + public async Task> GetAssignDeviceCodesAsync(string userCode) + { + var userNo = await _dbContext.Queryable().Where(x => x.Code == userCode || x.No == userCode).Select(x => x.No).SingleAsync(); + var result = await GetAssignDeviceCodesInternalAsync(new List { userNo }); + return result.First().Value.SelectMany(x => x.Codes).ToList(); + } + + private static List GetAssignDeviceCodesInternal( + GainfoDto gainfo, + List gainfoGroupRelationships, + List devicePermissions, + List deviceGroups, + List deviceGroupRelationships, + List deviceRegistries, + List devices, List departments) + { + if (gainfo.IsOutsource) + { + //外包人员不允许餐饮 + devices = devices.Where(x => x.Type != DeviceTypeEnumType.Meal).ToList(); + } + + var userNo = gainfo.No; + + var deviceDtos = new List(); + var deviceGroupDtos = new List(); + var businessPlaceDtos = new List(); + + //获取人员的分组,跨基地 + var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToList(); + + //按用户 + var du = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo); + var gu = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo); + var pu = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.User, userNo); + deviceDtos.AddRange(du); + deviceGroupDtos.AddRange(gu); + businessPlaceDtos.AddRange(pu); + + //按用户组 + foreach (var groupCode in gainfoGroups) + { + var dg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, groupCode.ToString()); + var gg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, groupCode.ToString()); + var pg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Group, groupCode.ToString()); + deviceDtos.AddRange(dg); + deviceGroupDtos.AddRange(gg); + businessPlaceDtos.AddRange(pg); + } + + //按部门 + var currentAssignValue = gainfo.Factory + ":" + gainfo.DepartmentNo; + var dd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, currentAssignValue); + var gd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, currentAssignValue); + var pd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Department, currentAssignValue); + deviceDtos.AddRange(dd); + deviceGroupDtos.AddRange(gd); + businessPlaceDtos.AddRange(pd); + + //按厂区 + if (!gainfo.IsOutsource || gainfo.EnableFactoryPermission) + { + var dt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory); + var gt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory); + var pt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Tenant, gainfo.Factory); + deviceDtos.AddRange(dt); + deviceGroupDtos.AddRange(gt); + businessPlaceDtos.AddRange(pt); + } + + var deviceGroupCodes = deviceGroupDtos.SelectMany(x => x.Codes).Distinct().ToList(); + var businessPlaceCodes = businessPlaceDtos.SelectMany(x => x.Codes).Distinct().ToList(); + + var deviceCodesByGroup = deviceGroupRelationships.Where(x => deviceGroupCodes.Contains(x.GroupCode)) + .GroupBy(x => x.TenantId) + .Select(x => new UserTenantDeviceCodeDto + { + Tenant = x.Key, + Codes = x.Select(item => item.DeviceCode).Distinct().ToList() + }); + + var placeGroup = deviceRegistries.Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode!.Value)) + .GroupBy(x => x.TenantId) + .Select(x => + { + var currentDeviceUniqueNos = x.Select(item => item.DeviceUniqueNo).ToList(); + + return new UserTenantDeviceCodeDto + { + Tenant = x.Key, + Codes = devices.Where(d => currentDeviceUniqueNos.Contains(d.UniqueNo)).Select(d => d.Code).Distinct().ToList() + }; + }).ToList(); + + deviceDtos.AddRange(deviceCodesByGroup); + deviceDtos.AddRange(placeGroup); + + return deviceDtos.GroupBy(x => x.Tenant).Select(x => + { + var dto = new UserTenantDeviceCodeDto + { + Tenant = x.Key, + Codes = x.SelectMany(item => item.Codes).Distinct().ToList() + }; + + dto.Codes = dto.Codes.Where(p => devices.Any(item => item.Code == p)).ToList(); + + return dto; + }).ToList(); + } + + public static List GetAssignDeviceCodesInternal2( + GainfoDto gainfo, + List gainfoGroups, + List gainfoGroupRelationships, + List devicePermissions, + List deviceGroups, + List deviceGroupRelationships, + List devices, List departments, params AssignTypeEnumType[] ignoreAssignTypes) + { + if (gainfo.IsOutsource) + { + //外包人员不允许餐饮 + devices = devices.Where(x => x.Type != DeviceTypeEnumType.Meal).ToList(); + } + + var deviceCodes = devices.Select(x => x.Code).ToList(); + + var deviceDtos = new List(); + var deviceGroupDtos = new List(); + + //获取人员的分组,跨基地 + var myGainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == gainfo.No).Select(x => x.GroupCode).ToList(); + + if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.User)) + { + //按用户 + deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, gainfo.No)); + deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, gainfo.No)); + } + + if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.Group)) + { + //按用户组 + foreach (var groupCode in myGainfoGroups) + { + deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, groupCode.ToString())); + deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, groupCode.ToString())); + } + } + + if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.Department)) + { + //按部门 + var currentAssignValue = gainfo.Factory + ":" + gainfo.DepartmentNo; + deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, currentAssignValue)); + deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, currentAssignValue)); + } + + if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.Tenant)) + { + //按厂区 + if (!gainfo.IsOutsource || gainfo.EnableFactoryPermission) + { + deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory)); + deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory)); + } + } + + //设备组转设备 + deviceDtos.AddRange(deviceGroupDtos.Select(x => + { + var tenant = x.Tenant; + + var deviceGroupCodes = x.Codes.SelectMany(item => item.Codes); + var type = x.Codes.ElementAt(0).AssignType; + return new TenantAssignTypeDeviceCode + { + Tenant = tenant, + Codes = new List + { + new() + { + AssignType = type, + Codes = deviceGroupRelationships.Where(item => deviceGroupCodes.Contains(item.GroupCode)).Select(item => item.DeviceCode).ToList() + } + } + }; + })); + + return deviceDtos.GroupBy(x => x.Tenant).Select(x => + { + var dto = new TenantAssignTypeDeviceCode + { + Tenant = x.Key, + Codes = x.SelectMany(p => p.Codes) + .GroupBy(p => p.AssignType) + .Select(p => new AssignTypeDeviceCode + { + AssignType = p.Key, + Codes = p.SelectMany(item => deviceCodes.Where(it => item.Codes.Contains(it))) + }) + }; + + return dto; + }).ToList(); + } + + private static List GetAssignCodesInternal( + List devicePermissions, List deviceGroups, List departments, + DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) + { + var tenantDevicePermissions = devicePermissions + .Where(x => x.UniqueType == uniqueType + && x.AssignType == assignType + && x.AssignValue == assignValue) + .GroupBy(x => x.TenantId) + .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) + .ToList(); + + //处理获取设备分组的情况 + if (uniqueType == DeviceAssignmentTypeEnumType.Group) + { + //开始递归处理 + var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList(); + tops.ForEach(x => { DeviceGroupRecursionGetNext(x, deviceGroups, tenantDevicePermissions, tenantDevicePermissions.SelectMany(item => item.Codes).Contains(x.Code)); }); + } + + if (assignType == AssignTypeEnumType.Department) + { + //递归向上获取 assignValue = department.No + var arr = assignValue.Split(":"); + var tenantId = arr.First(); + var currentDepartmentNo = arr.Last(); + var departmentNos = new List(12) { currentDepartmentNo }; + DepartmentRecursionGetPNo(currentDepartmentNo, departments, departmentNos); + + departmentNos = departmentNos.Select(x => tenantId + ":" + x).ToList(); + + tenantDevicePermissions = 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(); + } + + return tenantDevicePermissions.GroupBy(x => x.Tenant).Select(x => + { + var tenant = x.Key; + + return new UserTenantDeviceCodeDto + { + Tenant = tenant, + Codes = x.SelectMany(item => item.Codes).ToList() + }; + }).ToList(); + } + + private static List GetCurrentAssignTypePermissions( + List devicePermissions, + List gainfoGroups, + List departments, + DeviceAssignmentTypeEnumType uniqueType, + AssignTypeEnumType assignType, + string assignValue) + { + //处理分配到部门 + if (assignType == AssignTypeEnumType.Department) + { + // 2401:00001 + //递归向上获取 assignValue = department.No + var arr = assignValue.Split(":"); + 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(); + } + + 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(); + } + + //user / tenant + return devicePermissions + .Where(x => x.UniqueType == uniqueType //设备/设备组 + && x.AssignType == assignType // user/group/department/tenant + && x.AssignValue == assignValue) + .GroupBy(x => x.TenantId) + .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) + .ToList(); + } + + private static List 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, + Codes = new List + { + new() + { + AssignType = assignType, + Codes = x.SelectMany(item => item.Codes), + } + } + }; + }).ToList(); + } + + + /// + /// 获取当前基地有权限的用户 + /// + /// + private async Task> GetPermissionUserNosAsync() + { + var permissions = await _dbContext.Queryable().ToListAsync(); + + //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.Add(d); + RecursionGetNextAllDepartment(d, departments, departmentNosToSearch); + } + + 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 => tenants.Contains(x.Factory)).Select(x => x.No).ToListAsync(); + + return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).Distinct().ToList(); + + void RecursionGetNextAllDepartment(string current, List data, List result) + { + var next = data.Where(x => x.PNo == current); + foreach (var item in next.Select(x => x.No)) + { + result.Add(item); + RecursionGetNextAllDepartment(item, data, result); + } + } + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + static void DepartmentRecursionGetPNo(string current, List data, List result) + { + var p = data.FirstOrDefault(x => x.No == current)?.PNo; + if (!p.IsPresent()) + { + return; + } + + result.Add(p); + DepartmentRecursionGetPNo(p, data, result); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + static void DeviceGroupRecursionGetNext(DeviceGroupEntity current, List currentDeviceGroups, List result, bool add) + { + var next = currentDeviceGroups.Where(x => x.PCode == current.Code).ToList(); + foreach (var item in next) + { + if (add) + { + result.Add(new UserTenantDeviceCodeDto { Tenant = item.TenantId, Codes = new List { item.Code } }); + } + + DeviceGroupRecursionGetNext(item, currentDeviceGroups, result, result.SelectMany(x => x.Codes).Contains(item.Code)); + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index b6ced392..c0a38b64 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -1,13 +1,8 @@ -using System.Collections.Concurrent; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using Dlhis.Basic.DataPermissions; +using Dlhis.Basic.DataPermissions; using Dlhis.Basic.Device.Dtos; using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; -using Dlhis.Basic.Organization.Dto; 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; @@ -32,52 +27,41 @@ public class DevicePermissionService : IDevicePermissionService private readonly IMyDataPermissionService _myDataPermissionService; private readonly ITenantApi _tenantApi; private readonly IParallelService _parallelService; + private readonly INamedResolver _namedResolver; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly ICurrentUser _currentUser; public DevicePermissionService(IDbContext dbContext, IMyDataPermissionService myDataPermissionService, ITenantApi tenantApi, IParallelService parallelService, + INamedResolver namedResolver, + IDevicePermissionAnalyzeService devicePermissionAnalyzeService, ICurrentUser currentUser) { _dbContext = dbContext; _myDataPermissionService = myDataPermissionService; _tenantApi = tenantApi; _parallelService = parallelService; + _namedResolver = namedResolver; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; _currentUser = currentUser; } public async Task AssignAsync(DevicePermissionSaveRequest request) { + await _namedResolver.GetService(PermissionAnalyzeConstants.GetTypeName(request.AssignType)).AnalyzeAsync(request); + + return null; await CheckAssignTopDoorDeviceGroupAsync(request); var currentTenantId = _currentUser.GetStringTenantId(); var role = _currentUser.GetRole(); var isAll = role is "admin" or "tenant-admin"; - var deviceCodes = _myDataPermissionService.GetMyDeviceCodes(); - - if (request.AssignType == AssignTypeEnumType.Tenant && request.UniqueType == DeviceAssignmentTypeEnumType.Device) - { - return await AssignDeviceToTenantAsync(currentTenantId, isAll, deviceCodes, request); - } - - if (request.AssignType == AssignTypeEnumType.Tenant && request.UniqueType == DeviceAssignmentTypeEnumType.Group) - { - return await AssignDeviceGroupToTenantAsync(currentTenantId, request); - } - - if (request.AssignType == AssignTypeEnumType.Department && request.UniqueType == DeviceAssignmentTypeEnumType.Device) - { - return await AssignDeviceToDepartmentAsync(currentTenantId, isAll, deviceCodes, request); - } - - if (request.AssignType == AssignTypeEnumType.Department && request.UniqueType == DeviceAssignmentTypeEnumType.Group) - { - return await AssignDeviceGroupToDepartmentAsync(currentTenantId, request); - } + var deviceCodes = isAll ? new List() : _myDataPermissionService.GetMyDeviceCodes(); _parallelService.Enable = true; - return await GenerateDeviceTasksAsync(async () => + return await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => { request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; @@ -114,211 +98,6 @@ public class DevicePermissionService : IDevicePermissionService }, null); } - public async Task AssignDeviceToDepartmentAsync(string currentTenantId, bool isAll, List deviceCodes, DevicePermissionSaveRequest request) - { - var departmentValue = request.TenantId + ":" + request.AssignValue; - - var p = await _dbContext.Queryable() - .Where(x => x.AssignType == AssignTypeEnumType.Department) - .Where(x => x.AssignValue == departmentValue) - .Where(x => x.UniqueType == request.UniqueType) - .WhereIF(!isAll, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Where(x => x.TenantId == currentTenantId) - .ToListAsync(); - - var departments = await _dbContext.Queryable().ToListAsync(); - var departmentNos = new List { request.AssignValue }; - DepartmentRecursionGetNext(request.AssignValue, departments, departmentNos); - - var gainfoNos = await _dbContext.Queryable() - .Where(x => x.Factory == request.TenantId && departmentNos.Contains(x.DepartmentNo)) - .Select(x => x.No) - .ToListAsync(); - - var beforeDeviceCodes = p.Select(x => x.UniqueValue).ToList(); - var presentDeviceCodes = request.Codes.IsPresent() ? request.Codes : new List(); - - var addDeviceCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); - var deleteDeviceCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); - - await _dbContext.DeleteAsync(p); - //保存配置的权限 - if (request.Codes.IsPresent()) - { - var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity - { - AssignType = request.AssignType, - AssignValue = departmentValue, - UniqueType = request.UniqueType, - UniqueValue = code, - Type = request.Type, - TenantId = currentTenantId - }).ToList(); - - await _dbContext.InsertAsync(devicePermissions); - } - - var allDeviceCodes = addDeviceCodes.Concat(deleteDeviceCodes).ToList(); - var devices = await _dbContext.Queryable() - .Where(x => allDeviceCodes.Contains(x.Code)) - .Select(x => new { x.Code, x.UniqueNo, x.Type, x.TenantId }) - .ToListAsync(); - - var tasks = new List(); - foreach (var gainfoNo in gainfoNos) - { - tasks.AddRange(addDeviceCodes.Select(x => - { - var d = devices.First(item => item.Code == x); - return new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Add, - DeviceType = d.Type, - UserId = null, - UserNo = gainfoNo, - DeviceUniqueNo = d.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = d.TenantId, - }; - }).ToList()); - - tasks.AddRange(deleteDeviceCodes.Select(x => - { - var d = devices.First(item => item.Code == x); - return new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Delete, - DeviceType = d.Type, - UserId = null, - UserNo = gainfoNo, - DeviceUniqueNo = d.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = d.TenantId, - }; - }).ToList()); - } - - foreach (var items in tasks.Where(x => x.Type == DeviceTaskEnumType.Add).Chunk(500)) - { - await _dbContext.InsertAsync(items.ToList()); - } - - return new DevicePermissionAssignResponse - { - AddCount = addDeviceCodes.Count * gainfoNos.Count, - DeleteCount = deleteDeviceCodes.Count * gainfoNos.Count - }; - } - - - public async Task AssignDeviceGroupToDepartmentAsync(string currentTenantId, DevicePermissionSaveRequest request) - { - var departmentValue = request.TenantId + ":" + request.AssignValue; - - var groupData = await _dbContext.Queryable() - .Where(x => x.AssignType == AssignTypeEnumType.Department) - .Where(x => x.AssignValue == departmentValue) - .Where(x => x.UniqueType == request.UniqueType) - .Where(x => x.Type == request.Type) - .Where(x => x.TenantId == currentTenantId) - .ToListAsync(); - - var departments = await _dbContext.Queryable().ToListAsync(); - var departmentNos = new List { request.AssignValue }; - DepartmentRecursionGetNext(request.AssignValue, departments, departmentNos); - - var gainfoNos = await _dbContext.Queryable() - .Where(x => x.Factory == request.TenantId && departmentNos.Contains(x.DepartmentNo)) - .Select(x => x.No) - .ToListAsync(); - - var beforeDeviceCodes = groupData.Select(x => x.UniqueValue).ToList(); - var presentDeviceCodes = request.Codes.IsPresent() ? request.Codes : new List(); - - var addDeviceGroupCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); - var deleteDeviceGroupCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); - - await _dbContext.DeleteAsync(groupData); - //保存配置的权限 - if (request.Codes.IsPresent()) - { - var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity - { - AssignType = request.AssignType, - AssignValue = departmentValue, - UniqueType = request.UniqueType, - UniqueValue = code, - Type = request.Type, - TenantId = currentTenantId - }).ToList(); - - await _dbContext.InsertAsync(devicePermissions); - } - - var deviceGroups = await _dbContext.Queryable().ToListAsync(); - - var addDevices = await GetDevicesByGroupsAsync(deviceGroups, deviceGroups.Where(x => addDeviceGroupCodes.Contains(x.Code)).ToList()); - var deleteDevices = await GetDevicesByGroupsAsync(deviceGroups, deviceGroups.Where(x => deleteDeviceGroupCodes.Contains(x.Code)).ToList()); - - var tasks = new List(); - foreach (var gainfoNo in gainfoNos) - { - tasks.AddRange(addDevices.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(deleteDevices.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()); - } - - foreach (var items in tasks.Where(x => x.Type == DeviceTaskEnumType.Add).Chunk(500)) - { - await _dbContext.InsertAsync(items.ToList()); - } - - return new DevicePermissionAssignResponse - { - AddCount = addDevices.Count * gainfoNos.Count, - DeleteCount = deleteDevices.Count * gainfoNos.Count - }; - } - private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request) { @@ -337,42 +116,8 @@ public class DevicePermissionService : IDevicePermissionService } - public async Task AssignDeviceToTenantAsync(string currentTenantId, bool isAll, List deviceCodes, DevicePermissionSaveRequest request) + public async Task GenerateTasksAsync(List addDeviceCodes, List deleteDeviceCodes, List gainfoNos) { - var p = await _dbContext.Queryable() - .Where(x => x.AssignType == AssignTypeEnumType.Tenant) - .Where(x => x.AssignValue == request.AssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Where(x => x.TenantId == currentTenantId) - .ToListAsync(); - - var gainfoNos = await _dbContext.Queryable().Where(x => x.Factory == request.AssignValue).Select(x => x.No).ToListAsync(); - - var beforeDeviceCodes = p.Select(x => x.UniqueValue).ToList(); - var presentDeviceCodes = request.Codes.IsPresent() ? request.Codes : new List(); - - var addDeviceCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); - var deleteDeviceCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); - - await _dbContext.DeleteAsync(p); - //保存配置的权限 - if (request.Codes.IsPresent()) - { - var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity - { - AssignType = request.AssignType, - AssignValue = request.AssignValue, - UniqueType = request.UniqueType, - UniqueValue = code, - Type = request.Type, - TenantId = currentTenantId - }).ToList(); - - await _dbContext.InsertAsync(devicePermissions); - } - var allDeviceCodes = addDeviceCodes.Concat(deleteDeviceCodes).ToList(); var devices = await _dbContext.Queryable() .Where(x => allDeviceCodes.Contains(x.Code)) @@ -729,211 +474,13 @@ public class DevicePermissionService : IDevicePermissionService } } - public async Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request) - { - request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; - var role = _currentUser.GetRole(); - var isAll = role is "admin" or "tenant-admin"; - var deviceCodes = _myDataPermissionService.GetMyDeviceCodes(); - - return await _dbContext.Queryable() - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.AssignValue == request.AssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Select(x => x.UniqueValue) - .ToListAsync(); - } - - - public async Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request) - { - var nos = await _dbContext.Queryable() - .Where(x => x.UniqueType == request.UniqueType) - .Where(x => x.UniqueValue == request.UniqueValue) - .Where(x => x.AssignType == AssignTypeEnumType.User) - .Where(x => x.Type == request.Type) - .Select(x => x.AssignValue) - .ToListAsync(); - - return await _dbContext.Queryable().Where(x => nos.Contains(x.No)).Select(x => new GainfoDto - { - Id = x.Id, - Code = x.Code, - Name = x.Name, - Workplace = x.Workplace, - Factory = x.Factory - }).ToListAsync(); - } - /// public async Task>> GetUserDevicePermissionsAsync(string code) { var userNo = await _dbContext.Queryable().Where(x => x.Code == code).Select(x => x.No).SingleAsync(); - return await GetAssignDeviceCodesInternalAsync(new List { userNo }); + return await _devicePermissionAnalyzeService.GetAssignDeviceCodesInternalAsync(new List { userNo }); } - /// - public async Task GetUserDevicePermissions2Async() - { - var today = DateTime.Today; - var yesterday = today.AddDays(-1); - - var tripInfos = await _dbContext.Queryable() - .LeftJoin((x, ga) => x.Code == ga.Code) - .Where(x => SqlFunc.DateIsSame(x.BeginDate, today) || SqlFunc.DateIsSame(x.BeginDate, yesterday)) - .Where(x => !SqlFunc.IsNullOrEmpty(x.Destination)) - .Select((x, ga) => new - { - x.Code, UserNo = ga.No - }) - .ToListAsync(); - - - //获取人员的设备权限 - - var userNos = tripInfos.Select(x => x.UserNo).Distinct().ToList(); - var result = await GetAssignDeviceCodesInternalAsync(userNos); - - foreach (var tripInfo in tripInfos.Where(x => x.UserNo.IsPresent())) - { - var myDeviceCodes = result[tripInfo.UserNo].SelectMany(x => x.Codes); - - var devices = await _dbContext.Queryable().Where(x => myDeviceCodes.Contains(x.Code)).ToListAsync(); - - var tasks = devices.Select(x => new DeviceTaskEntity - { - DeviceUniqueNo = x.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - UserNo = tripInfo.UserNo, - Type = DeviceTaskEnumType.Add, - DeviceType = x.Type, - TenantId = x.TenantId, - Priority = 10, - Source = DeviceTaskSourceEnumType.Manually - }).ToList(); - - await _dbContext.InsertAsync(tasks); - } - } - - public async Task GenerateDeviceTasksAsync(Func func, List userNos) - { - var getAllUser = userNos.IsEmpty(); - - //获取所有人的权限 - if (getAllUser) - userNos = await GetPermissionUserNosAsync(); - - var before = await GetAssignDeviceCodesInternalAsync(userNos); - - //业务处理 - _dbContext.Client.QueryFilter.Restore(); - await func(); - _dbContext.Client.QueryFilter.ClearAndBackup(); - - //获取业务处理后所有人的权限 - if (getAllUser) - { - var nextUserNos = await GetPermissionUserNosAsync(); - if (nextUserNos.Any()) - userNos = userNos.Concat(nextUserNos).Distinct().ToList(); - } - - var current = await GetAssignDeviceCodesInternalAsync(userNos); - - var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); - // var waitAddTasks = new ConcurrentBag(); - // var waitDeleteTasks = new ConcurrentBag(); - - var waitAddTasks = new List(); - var waitDeleteTasks = new List(); - - // Parallel.ForEach(userNos, userNo => - // { - foreach (var userNo in userNos) - { - before.TryGetValue(userNo, out var beforeTenantDeviceCodes); - beforeTenantDeviceCodes ??= new List(); - current.TryGetValue(userNo, out var currentTenantDeviceCodes); - currentTenantDeviceCodes ??= new List(); - - var tenants = new HashSet(); - foreach (var item in beforeTenantDeviceCodes) - tenants.Add(item.Tenant); - foreach (var item in currentTenantDeviceCodes) - tenants.Add(item.Tenant); - - foreach (var tenant in tenants) - { - var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); - var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); - - //被删除 - var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList(); - //新增 - var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList(); - - if (!deletedItems.Any() && !addItems.Any()) - { - continue; - } - - var deviceCodes = devices.Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).Select(x => x.Code).ToList(); - deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList(); - addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList(); - - //下发任务创建 - deletedItems.ForEach(x => waitDeleteTasks.Add(new DeviceTaskEntity - { - DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Type = DeviceTaskEnumType.Delete, - CancellationId = 0, - DeviceType = devices.First(item => item.Code == x).Type, - UserNo = userNo, - Version = 0, - TenantId = tenant, - Source = DeviceTaskSourceEnumType.Manually - })); - - addItems.ForEach(x => waitAddTasks.Add(new DeviceTaskEntity - { - DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Type = DeviceTaskEnumType.Add, - DeviceType = devices.First(item => item.Code == x).Type, - UserNo = userNo, - Version = 0, - TenantId = tenant, - Source = DeviceTaskSourceEnumType.Manually - })); - } - } - // }); - - if (waitAddTasks.Any()) - await ChunkInsertAsync(waitAddTasks.ToList()); - - if (waitDeleteTasks.Any()) - await ChunkInsertAsync(waitDeleteTasks.ToList()); - - return new DevicePermissionAssignResponse - { - AddCount = waitAddTasks.Count, - DeleteCount = waitDeleteTasks.Count - }; - - async Task ChunkInsertAsync(List batch) where T : class, new() - { - foreach (var tasks in batch.Chunk(500)) - { - await _dbContext.InsertAsync(tasks.ToList()); - } - } - } public async Task> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request) { @@ -1154,344 +701,7 @@ public class DevicePermissionService : IDevicePermissionService public async Task> GetAssignDeviceCodesAsync(string userCode) { var userNo = await _dbContext.Queryable().Where(x => x.Code == userCode || x.No == userCode).Select(x => x.No).SingleAsync(); - var result = await GetAssignDeviceCodesInternalAsync(new List { userNo }); + var result = await _devicePermissionAnalyzeService.GetAssignDeviceCodesInternalAsync(new List { userNo }); return result.First().Value.SelectMany(x => x.Codes).ToList(); } - - //************************************************ help methods ******************************************************* - - /// - /// 获取当前基地有权限的用户 - /// - /// - private async Task> GetPermissionUserNosAsync() - { - var permissions = await _dbContext.Queryable().ToListAsync(); - - //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.Add(d); - RecursionGetNextAllDepartment(d, departments, departmentNosToSearch); - } - - 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 => tenants.Contains(x.Factory)).Select(x => x.No).ToListAsync(); - - return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).Distinct().ToList(); - - void RecursionGetNextAllDepartment(string current, List data, List result) - { - var next = data.Where(x => x.PNo == current); - foreach (var item in next.Select(x => x.No)) - { - result.Add(item); - RecursionGetNextAllDepartment(item, data, result); - } - } - } - - private static List GetAssignCodesInternal( - List devicePermissions, List deviceGroups, List departments, - DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) - { - var tenantDevicePermissions = devicePermissions - .Where(x => x.UniqueType == uniqueType - && x.AssignType == assignType - && x.AssignValue == assignValue) - .GroupBy(x => x.TenantId) - .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) - .ToList(); - - //处理获取设备分组的情况 - if (uniqueType == DeviceAssignmentTypeEnumType.Group) - { - //开始递归处理 - var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList(); - tops.ForEach(x => { DeviceGroupRecursionGetNext(x, deviceGroups, tenantDevicePermissions, tenantDevicePermissions.SelectMany(item => item.Codes).Contains(x.Code)); }); - } - - if (assignType == AssignTypeEnumType.Department) - { - //递归向上获取 assignValue = department.No - var arr = assignValue.Split(":"); - var tenantId = arr.First(); - var currentDepartmentNo = arr.Last(); - var departmentNos = new List(12) { currentDepartmentNo }; - DepartmentRecursionGetPNo(currentDepartmentNo, departments, departmentNos); - - departmentNos = departmentNos.Select(x => tenantId + ":" + x).ToList(); - - tenantDevicePermissions = 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(); - } - - return tenantDevicePermissions.GroupBy(x => x.Tenant).Select(x => - { - var tenant = x.Key; - - return new UserTenantDeviceCodeDto - { - Tenant = tenant, - Codes = x.SelectMany(item => item.Codes).ToList() - }; - }).ToList(); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void DepartmentRecursionGetPNo(string current, List data, List result) - { - var p = data.FirstOrDefault(x => x.No == current)?.PNo; - if (!p.IsPresent()) - { - return; - } - - result.Add(p); - DepartmentRecursionGetPNo(p, data, result); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void DeviceGroupRecursionGetNext(DeviceGroupEntity current, List currentDeviceGroups, List result, bool add) - { - var next = currentDeviceGroups.Where(x => x.PCode == current.Code).ToList(); - foreach (var item in next) - { - if (add) - { - result.Add(new UserTenantDeviceCodeDto { Tenant = item.TenantId, Codes = new List { item.Code } }); - } - - DeviceGroupRecursionGetNext(item, currentDeviceGroups, result, result.SelectMany(x => x.Codes).Contains(item.Code)); - } - } - - - private async Task>> GetAssignDeviceCodesInternalAsync(List userNos) - { - var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); - var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList(); - var registries = await _dbContext.Queryable() - .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) - .Where(x => !SqlFunc.IsNullOrEmpty(x.BusinessPlaceCode)) - .ToListAsync(); - - var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); - if (!gainfos.Any()) - { - return new Dictionary>(); - } - - var enableFactoryPermissions = await _dbContext.Queryable().ToListAsync(); - - var gainfoGroupRelationships = await _dbContext.Queryable().Where(x => userNos.Contains(x.UserNo)).ToListAsync(); - var devicePermissions = await _dbContext.Queryable().ToListAsync(); - var deviceGroups = await _dbContext.Queryable().ToListAsync(); - var deviceRelationships = await _dbContext.Queryable().ToListAsync(); - var departments = await _dbContext.Queryable().ToListAsync(); - - if (_parallelService.Enable) - { - var result = new ConcurrentDictionary>(); - - Parallel.ForEach(gainfos, new ParallelOptions { MaxDegreeOfParallelism = 4 }, gainfo => - { - var gainfoDto = new GainfoDto - { - Id = gainfo.Id, - No = gainfo.No, - Code = gainfo.Code, - Name = gainfo.Name, - Workplace = gainfo.Workplace, - Factory = gainfo.Factory, - DepartmentNo = gainfo.DepartmentNo, - IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, - EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true - }; - - var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); - result.TryAdd(gainfo.No, codes); - }); - - return result.ToDictionary(x => x.Key, x => x.Value); - } - else - { - var result = new Dictionary>(); - foreach (var gainfo in gainfos) - { - var gainfoDto = new GainfoDto - { - Id = gainfo.Id, - No = gainfo.No, - Code = gainfo.Code, - Name = gainfo.Name, - Workplace = gainfo.Workplace, - Factory = gainfo.Factory, - DepartmentNo = gainfo.DepartmentNo, - IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, - EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true - }; - - var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); - result.Add(gainfo.No, codes); - } - - return result; - } - } - - - private List GetAssignDeviceCodesInternal( - GainfoDto gainfo, - List gainfoGroupRelationships, - List devicePermissions, - List deviceGroups, - List deviceGroupRelationships, - List deviceRegistries, - List devices, List departments) - { - if (gainfo.IsOutsource) - { - //外包人员不允许餐饮 - devices = devices.Where(x => x.Type != DeviceTypeEnumType.Meal).ToList(); - } - - var userNo = gainfo.No; - - var deviceDtos = new List(); - var deviceGroupDtos = new List(); - var businessPlaceDtos = new List(); - - //获取人员的分组,跨基地 - var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToList(); - - //按用户 - var du = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo); - var gu = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo); - var pu = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.User, userNo); - deviceDtos.AddRange(du); - deviceGroupDtos.AddRange(gu); - businessPlaceDtos.AddRange(pu); - - //按用户组 - foreach (var groupCode in gainfoGroups) - { - var dg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, groupCode.ToString()); - var gg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, groupCode.ToString()); - var pg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Group, groupCode.ToString()); - deviceDtos.AddRange(dg); - deviceGroupDtos.AddRange(gg); - businessPlaceDtos.AddRange(pg); - } - - //按部门 - var currentAssignValue = gainfo.Factory + ":" + gainfo.DepartmentNo; - var dd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, currentAssignValue); - var gd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, currentAssignValue); - var pd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Department, currentAssignValue); - deviceDtos.AddRange(dd); - deviceGroupDtos.AddRange(gd); - businessPlaceDtos.AddRange(pd); - - //按厂区 - if (!gainfo.IsOutsource || gainfo.EnableFactoryPermission) - { - var dt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory); - var gt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory); - var pt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Tenant, gainfo.Factory); - deviceDtos.AddRange(dt); - deviceGroupDtos.AddRange(gt); - businessPlaceDtos.AddRange(pt); - } - - var deviceGroupCodes = deviceGroupDtos.SelectMany(x => x.Codes).Distinct().ToList(); - var businessPlaceCodes = businessPlaceDtos.SelectMany(x => x.Codes).Distinct().ToList(); - - var deviceCodesByGroup = deviceGroupRelationships.Where(x => deviceGroupCodes.Contains(x.GroupCode)) - .GroupBy(x => x.TenantId) - .Select(x => new UserTenantDeviceCodeDto - { - Tenant = x.Key, - Codes = x.Select(item => item.DeviceCode).Distinct().ToList() - }); - - var placeGroup = deviceRegistries.Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode!.Value)) - .GroupBy(x => x.TenantId) - .Select(x => - { - var currentDeviceUniqueNos = x.Select(item => item.DeviceUniqueNo).ToList(); - - return new UserTenantDeviceCodeDto - { - Tenant = x.Key, - Codes = devices.Where(d => currentDeviceUniqueNos.Contains(d.UniqueNo)).Select(d => d.Code).Distinct().ToList() - }; - }).ToList(); - - deviceDtos.AddRange(deviceCodesByGroup); - deviceDtos.AddRange(placeGroup); - - return deviceDtos.GroupBy(x => x.Tenant).Select(x => - { - var dto = new UserTenantDeviceCodeDto - { - Tenant = x.Key, - Codes = x.SelectMany(item => item.Codes).Distinct().ToList() - }; - - dto.Codes = dto.Codes.Where(p => devices.Any(item => item.Code == p)).ToList(); - - return dto; - }).ToList(); - } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs new file mode 100644 index 00000000..6a96a821 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs @@ -0,0 +1,28 @@ +using Dlhis.Entity.Basic.Entity; + +namespace Dlhis.Basic.Device.Services.Implements.PermissionAnalyze; + +[Service(PermissionAnalyzeConstants.Department)] +public class DepartmentPermissionAnalyzeService : BasePermissionAnalyzeService +{ + /// + public DepartmentPermissionAnalyzeService(IServiceProvider serviceProvider) : base(serviceProvider) + { + } + + /// + protected override async Task> GetGainfoNosAsync(string assignValue) + { + var data = assignValue.Split(":"); + var factory = data[0]; + var departmentNo = data[1]; + + var departments = await DbContext.Queryable().ToListAsync(); + var departmentNos = RecursionHelper.HandlerDepartmentNextCodes(departmentNo, departments); + + return await DbContext.Queryable() + .Where(x => x.Factory == factory && departmentNos.Contains(x.DepartmentNo)) + .Select(x => x.No) + .ToListAsync(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs new file mode 100644 index 00000000..d68de6f8 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs @@ -0,0 +1,27 @@ +using Dlhis.Entity.Basic.Entity; + +namespace Dlhis.Basic.Device.Services.Implements.PermissionAnalyze; + +[Service(PermissionAnalyzeConstants.Group)] +public class GroupPermissionAnalyzeService : BasePermissionAnalyzeService +{ + /// + public GroupPermissionAnalyzeService(IServiceProvider serviceProvider) : base(serviceProvider) + { + } + + /// + protected override async Task> GetGainfoNosAsync(string assignValue) + { + var code = Guid.Parse(assignValue); + + var gainfoGroups = await DbContext.Queryable().ToListAsync(); + var gainfoGroupCodes = RecursionHelper.HandlerGainfoGroupNextCodes(code, gainfoGroups); + + return await DbContext.Queryable() + .Where(x => gainfoGroupCodes.Contains(x.GroupCode)) + .Select(x => x.UserNo) + .Distinct() + .ToListAsync(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs new file mode 100644 index 00000000..d26b9673 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs @@ -0,0 +1,18 @@ +using Dlhis.Entity.Basic.Entity; + +namespace Dlhis.Basic.Device.Services.Implements.PermissionAnalyze; + +[Service(PermissionAnalyzeConstants.Tenant)] +public class TenantPermissionAnalyzeService : BasePermissionAnalyzeService +{ + /// + public TenantPermissionAnalyzeService(IServiceProvider serviceProvider) : base(serviceProvider) + { + } + + /// + protected override async Task> GetGainfoNosAsync(string assignValue) + { + return await DbContext.Queryable().Where(x => x.Factory == assignValue).Select(x => x.No).ToListAsync(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/UserPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/UserPermissionAnalyzeService.cs new file mode 100644 index 00000000..3e819ae4 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/UserPermissionAnalyzeService.cs @@ -0,0 +1,16 @@ +namespace Dlhis.Basic.Device.Services.Implements.PermissionAnalyze; + +[Service(PermissionAnalyzeConstants.User)] +public class UserPermissionAnalyzeService : BasePermissionAnalyzeService +{ + /// + public UserPermissionAnalyzeService(IServiceProvider serviceProvider) : base(serviceProvider) + { + } + + /// + protected override async Task> GetGainfoNosAsync(string assignValue) + { + return await Task.FromResult(new List { assignValue }); + } +} \ 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 619dddde..5cd582d7 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -13,13 +13,13 @@ public class GainfoGroupService : IGainfoGroupService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; - private readonly IDevicePermissionService _devicePermissionService; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; - public GainfoGroupService(IDbContext dbContext, ICurrentUser currentUser, IDevicePermissionService devicePermissionService) + public GainfoGroupService(IDbContext dbContext, ICurrentUser currentUser, IDevicePermissionAnalyzeService devicePermissionAnalyzeService) { _dbContext = dbContext; _currentUser = currentUser; - _devicePermissionService = devicePermissionService; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; } public async Task> GetTreeAsync() @@ -82,7 +82,7 @@ public class GainfoGroupService : IGainfoGroupService var existsNextGroup = await _dbContext.Queryable().Where(x => x.PCode == request.GroupCode).AnyAsync(); existsNextGroup.ThrowIfTrue("存在下级分组,无法分配人员"); - await _devicePermissionService.GenerateDeviceTasksAsync(async () => + await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => { var relations = await _dbContext.Queryable() .Where(x => x.GroupCode == request.GroupCode) diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs index b5a809eb..5889d5ef 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs @@ -18,13 +18,13 @@ namespace Dlhis.Basic.Organization.Services.Implements; public class GainfoPermissionService : IGainfoPermissionService { private readonly IGainfoStore _gainfoStore; - private readonly IDevicePermissionService _devicePermissionService; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly IDbContext _dbContext; - public GainfoPermissionService(IGainfoStore gainfoStore, IDevicePermissionService devicePermissionService, IDbContext dbContext) + public GainfoPermissionService(IGainfoStore gainfoStore, IDevicePermissionAnalyzeService devicePermissionAnalyzeService, IDbContext dbContext) { _gainfoStore = gainfoStore; - _devicePermissionService = devicePermissionService; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; _dbContext = dbContext; } @@ -40,7 +40,7 @@ public class GainfoPermissionService : IGainfoPermissionService } //用户所有deviceCode权限 - var deviceCodes = await _devicePermissionService.GetAssignDeviceCodesAsync(gainfo.Code); + var deviceCodes = await _devicePermissionAnalyzeService.GetAssignDeviceCodesAsync(gainfo.Code); return await _dbContext.Queryable() .LeftJoin((x, dr) => x.UniqueNo == dr.DeviceUniqueNo) @@ -120,7 +120,7 @@ public class GainfoPermissionService : IGainfoPermissionService public async Task> GetAssignDeviceCodesAsync(DeviceAssRequest request) { - var ids = await _devicePermissionService.GetAssignDeviceCodesAsync(request.UserNo); + var ids = await _devicePermissionAnalyzeService.GetAssignDeviceCodesAsync(request.UserNo); var page = await _dbContext.Queryable() .LeftJoin((d, dt) => d.TemplateCode == dt.Code) @@ -149,10 +149,6 @@ public class GainfoPermissionService : IGainfoPermissionService .Where(x => x.No == userNo) .SingleAsync(); - - var msg = gainfo == null ? "不存在职数据" : string.Empty; - - //如果找不到就为离职人员 if (gainfo == null) { gainfo = await _dbContext.Queryable().AS("GainfoLeave") @@ -163,16 +159,14 @@ public class GainfoPermissionService : IGainfoPermissionService { gainfo.Id = gainfo.IdentityUserId; } - - msg += gainfo == null ? "并且不存在离职数据" : string.Empty; } - gainfo.ThrowIfNull($"档案数据有误:{msg}"); + gainfo.ThrowIfNull("档案数据不存在"); //获取人员的设备权限 if (deviceCodes.IsEmpty()) { - deviceCodes = await _devicePermissionService.GetAssignDeviceCodesAsync(gainfo!.Code); + deviceCodes = await _devicePermissionAnalyzeService.GetAssignDeviceCodesAsync(gainfo!.Code); } var devices = await _dbContext.Queryable().Where(x => deviceCodes.Contains(x.Code)).ToListAsync(); @@ -198,7 +192,7 @@ public class GainfoPermissionService : IGainfoPermissionService public async Task> GetAssignGroupAsync(string userNo) { //(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo - var groups = await _devicePermissionService.GetAssignmentsAsync(new DeviceGetAssignmentsRequest + var groups = await _devicePermissionAnalyzeService.GetAssignmentsAsync(new DeviceGetAssignmentsRequest { UniqueType = DeviceAssignmentTypeEnumType.Group, AssignType = AssignTypeEnumType.User, diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs index 5681b72c..15fded70 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs @@ -16,7 +16,7 @@ public class GainfoUpdateService : IGainfoUpdateService private readonly ILogger _logger; private readonly ITenantApi _tenantApi; private readonly IJinkoSapService _jinkoSapService; - private readonly IDevicePermissionService _devicePermissionService; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly IIdentityUserSyncService _identityUserSyncService; private List _tenants; @@ -25,7 +25,7 @@ public class GainfoUpdateService : IGainfoUpdateService ILogger logger, ITenantApi tenantApi, IJinkoSapService jinkoSapService, - IDevicePermissionService devicePermissionService, + IDevicePermissionAnalyzeService devicePermissionAnalyzeService, IIdentityUserSyncService identityUserSyncService) { _dbContext = dbContext; @@ -33,7 +33,7 @@ public class GainfoUpdateService : IGainfoUpdateService _logger = logger; _tenantApi = tenantApi; _jinkoSapService = jinkoSapService; - _devicePermissionService = devicePermissionService; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; _identityUserSyncService = identityUserSyncService; } @@ -169,7 +169,7 @@ public class GainfoUpdateService : IGainfoUpdateService if (item.isowner == "T") { - await _devicePermissionService.GenerateDeviceTasksAsync(async () => + await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => { await _dbContext.InsertAsync(info); await _identityUserSyncService.SyncAccountAsync(info.Code, info.Name, info.IdNo, info.Factory); @@ -259,7 +259,7 @@ public class GainfoUpdateService : IGainfoUpdateService { if (item.isowner == "T") { - await _devicePermissionService.GenerateDeviceTasksAsync(async () => + await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => { await _dbContext.Updateable().SetColumns(g => new GainfoEntity { @@ -287,7 +287,7 @@ public class GainfoUpdateService : IGainfoUpdateService } else { - await _devicePermissionService.GenerateDeviceTasksAsync(async () => + await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => { await _dbContext.Updateable().SetColumns(g => new GainfoEntity { diff --git a/Src/Dlhis.Basic/ParallelExtensions.cs b/Src/Dlhis.Basic/ParallelExtensions.cs new file mode 100644 index 00000000..d8bf78d7 --- /dev/null +++ b/Src/Dlhis.Basic/ParallelExtensions.cs @@ -0,0 +1,9 @@ +namespace Dlhis.Basic; + +public static class ParallelExtensions +{ + public static void ParallelForEach(this IEnumerable source, Action action) + { + Parallel.ForEach(source, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, action); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/RecursionHelper.cs b/Src/Dlhis.Basic/RecursionHelper.cs new file mode 100644 index 00000000..9a953c94 --- /dev/null +++ b/Src/Dlhis.Basic/RecursionHelper.cs @@ -0,0 +1,109 @@ +using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Device.Entities; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic; + +public static class RecursionHelper +{ + public static List HandlerGainfoGroupNextCodes(Guid current, List data) + { + var result = new List { current }; + + InternalHandlerCodes(current, data, result); + + return result; + + static void InternalHandlerCodes(Guid internalCurrent, List internalData, List internalResult) + { + var next = internalData.Where(x => x.PCode == internalCurrent); + foreach (var item in next) + { + internalResult.Add(item.Code); + InternalHandlerCodes(item.Code, internalData, internalResult); + } + } + } + + public static List HandlerGainfoGroupPreviousCodes(Guid current, List data) + { + var result = new List { current }; + + InternalHandlerCodes(current, data, result); + + return result; + + static void InternalHandlerCodes(Guid internalCurrent, List internalData, List internalResult) + { + var pno = internalData.FirstOrDefault(x => x.Code == internalCurrent)?.PCode; + if (!pno.HasValue) + { + return; + } + + internalResult.Add(pno.Value); + InternalHandlerCodes(pno.Value, internalData, internalResult); + } + } + + + public static List HandlerDepartmentNextCodes(string current, List data) + { + var result = new List { current }; + + InternalHandlerCodes(current, data, result); + + return result; + + static void InternalHandlerCodes(string internalCurrent, List internalData, List internalResult) + { + var next = internalData.Where(x => x.PNo == internalCurrent); + foreach (var item in next) + { + internalResult.Add(item.No); + InternalHandlerCodes(item.No, internalData, internalResult); + } + } + } + + public static List HandlerDepartmentPreviousCodes(string current, List data) + { + var result = new List { current }; + + InternalHandlerCodes(current, data, result); + + return result; + + static void InternalHandlerCodes(string internalCurrent, List internalData, List internalResult) + { + var pno = internalData.FirstOrDefault(x => x.No == internalCurrent)?.PNo; + if (pno.IsEmpty()) + { + return; + } + + internalResult.Add(pno); + InternalHandlerCodes(pno, internalData, internalResult); + } + } + + + public static List HandlerDeviceGroupNextCodes(Guid current, List data) + { + var result = new List { current }; + + InternalHandlerCodes(current, data, result); + + return result; + + static void InternalHandlerCodes(Guid internalCurrent, List internalData, List internalResult) + { + var next = internalData.Where(x => x.PCode == internalCurrent); + foreach (var item in next) + { + internalResult.Add(item.Code); + InternalHandlerCodes(item.Code, internalData, internalResult); + } + } + } +} \ No newline at end of file From fba9ae7cce88fe6d699ff6d40029001170f7c828 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 10 Dec 2024 17:30:39 +0800 Subject: [PATCH 02/22] =?UTF-8?q?feat=20=E4=BC=98=E5=8C=96=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionsController.cs | 11 +- .../Device/Dtos/PermissionUsersInfoDto.cs | 15 - ...deDto.cs => TenantAssignTypeDeviceCode.cs} | 55 +- .../Filters/AssignPermissionLimitAttribute.cs | 5 +- .../Device/PermissionAnalyzeConstants.cs | 3 +- .../Device/Request/DeviceAssignRequest.cs | 2 +- .../Request/DevicePermissionSaveRequest.cs | 9 + .../DevicePermissionAssignResponse.cs | 6 + .../IDevicePermissionAnalyzeService.cs | 5 +- .../Services/IDevicePermissionService.cs | 2 +- .../Device/Services/IParallelService.cs | 6 - .../Services/IPermissionAnalyzeService.cs | 11 +- .../BasePermissionAnalyzeService.cs | 136 +++- .../Services/Implements/DeviceGroupService.cs | 71 +- .../DevicePermissionAnalyzeService.cs | 695 ++++-------------- .../Implements/DevicePermissionService.cs | 277 +------ .../Services/Implements/ParallelService.cs | 7 - .../ObfuscateProviderJsonConverter.cs | 2 +- Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs | 17 +- .../Services/Implements/GainfoGroupService.cs | 78 +- .../Implements/GainfoOutsourceService.cs | 2 +- Src/Dlhis.Basic/Program.cs | 2 +- Src/Dlhis.Basic/RecursionHelper.cs | 21 + .../Services/Implements/BalanceService.cs | 1 + .../Order/Services/Implements/OrderService.cs | 1 + Src/Dlhis.Canteen/Program.cs | 1 + Src/Dlhis.Entity/Dlhis.Entity.csproj | 8 +- Src/Dlhis.Entity/SqlSugarPack.cs | 4 +- .../Services/Implements/AppointmentService.cs | 2 +- Src/Dlhis.External/Program.cs | 3 +- .../Services/Implements/HealthcheckService.cs | 6 +- .../Services/Implements/OrderService.cs | 2 +- Src/Dlhis.ScheduledTask/BaseJob.cs | 2 +- Src/Dlhis.ScheduledTask/Program.cs | 4 +- .../Controllers/HangfireController.cs | 2 +- .../Services/Implements/RoleService.cs | 2 +- Src/Dlhis.Sys/Program.cs | 2 +- 37 files changed, 476 insertions(+), 1002 deletions(-) delete mode 100644 Src/Dlhis.Basic/Device/Dtos/PermissionUsersInfoDto.cs rename Src/Dlhis.Basic/Device/Dtos/{UserTenantDeviceCodeDto.cs => TenantAssignTypeDeviceCode.cs} (72%) delete mode 100644 Src/Dlhis.Basic/Device/Services/IParallelService.cs delete mode 100644 Src/Dlhis.Basic/Device/Services/Implements/ParallelService.cs diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index d42822b9..0e26e4f6 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -1,5 +1,4 @@ -using Dlhis.Basic.Device.Dtos; -using Dlhis.Basic.Device.Filters; +using Dlhis.Basic.Device.Filters; using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Basic.Device.Services; @@ -108,12 +107,4 @@ public class DevicePermissionsController : ControllerBase { return await _devicePermissionService.GetAssignDeviceCodesAsync(userCode); } - - [AllowAnonymous] - [HttpGet("test")] - [IgnoreTenant] - public async Task>> GetUserDevicePermissionsAsync(string code) - { - return await _devicePermissionService.GetUserDevicePermissionsAsync(code); - } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Dtos/PermissionUsersInfoDto.cs b/Src/Dlhis.Basic/Device/Dtos/PermissionUsersInfoDto.cs deleted file mode 100644 index ac59afd3..00000000 --- a/Src/Dlhis.Basic/Device/Dtos/PermissionUsersInfoDto.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Dlhis.Basic.Device.Dtos -{ - public class PermissionUsersInfoDto - { - /// - /// 拥有权限的用户 - /// - public List UserNos { get; set; } - - /// - /// 用户对应的 [ 厂区--设备Code ] - /// - public Dictionary> PermissionInfos { get; set; } - } -} diff --git a/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs similarity index 72% rename from Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs rename to Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs index 52065902..19760256 100644 --- a/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs +++ b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs @@ -2,6 +2,35 @@ namespace Dlhis.Basic.Device.Dtos; +/// +/// 厂区对应分配类型的设备权限 +/// +public class TenantAssignTypeDeviceCode +{ + /// + /// 租户 + /// + public string Tenant { get; set; } + + /// + /// 设备权限 + /// + public IEnumerable AssignTypes { get; init; } +} + +public class AssignTypeDeviceCode +{ + /// + /// 分配类型 + /// + public AssignTypeEnumType AssignType { get; init; } + + /// + /// 设备权限 + /// + public IEnumerable Codes { get; init; } +} + public class UserTenantDeviceCodeDto { /// @@ -9,32 +38,6 @@ public class UserTenantDeviceCodeDto /// public string Tenant { get; set; } - /// - /// 设备权限 - /// - public IEnumerable Codes { get; set; } -} - -public class TenantAssignTypeDeviceCode -{ - /// - /// 租户 - /// - public string Tenant { get; set; } - - /// - /// 设备权限 - /// - public IEnumerable Codes { get; set; } -} - -public class AssignTypeDeviceCode -{ - /// - /// 分配类型 - /// - public AssignTypeEnumType AssignType { get; set; } - /// /// 设备权限 /// diff --git a/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs index fa96d0d8..9f4d637b 100644 --- a/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs +++ b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs @@ -1,5 +1,5 @@ using Kurisu.AspNetCore.Authentication.Abstractions; -using Kurisu.AspNetCore.Utils; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.AspNetCore.Mvc.Filters; @@ -11,12 +11,11 @@ public class AssignPermissionLimitAttribute : Attribute, IAsyncActionFilter public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var currentUser = context.HttpContext.RequestServices.GetRequiredService(); - //var userId = currentUser.GetIntSubjectId(); var redisCache = context.HttpContext.RequestServices.GetRequiredService(); var currentTenantId = currentUser.GetStringTenantId(); - await using var handler = await redisCache.LockAsync($"permission:generate:{currentTenantId}"); + await using var handler = await redisCache.LockAsync($"permission:generate:{currentTenantId}", expiry: TimeSpan.FromMinutes(3)); handler.Acquired.ThrowIfFalse("请勿频繁分配"); await next(); } diff --git a/Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs b/Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs index 6f0e1221..2232d201 100644 --- a/Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs +++ b/Src/Dlhis.Basic/Device/PermissionAnalyzeConstants.cs @@ -2,7 +2,7 @@ using Dlhis.Entity.Sys.Enums; namespace Dlhis.Basic.Device; -public class PermissionAnalyzeConstants +public static class PermissionAnalyzeConstants { private const string _verb = "PermissionAnalyze"; public const string User = nameof(AssignTypeEnumType.User) + _verb; @@ -10,7 +10,6 @@ public class PermissionAnalyzeConstants public const string Department = nameof(AssignTypeEnumType.Department) + _verb; public const string Tenant = nameof(AssignTypeEnumType.Tenant) + _verb; - public static string GetTypeName(AssignTypeEnumType assignTypeEnumType) { return assignTypeEnumType + _verb; diff --git a/Src/Dlhis.Basic/Device/Request/DeviceAssignRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceAssignRequest.cs index 3a6be64f..a04dd833 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceAssignRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceAssignRequest.cs @@ -13,5 +13,5 @@ public class DeviceAssignRequest /// /// 设备code /// - public List DeviceCodes { get; set; } = new List(); + public List DeviceCodes { get; set; } = new(); } diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs index 067b7d5f..c47e060c 100644 --- a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveRequest.cs @@ -61,4 +61,13 @@ public class DevicePermissionSaveRequest : IValidatableObject yield return new ValidationResult("暂不支持角色分配", new[] { nameof(AssignType) }); } } + + /// + /// 获取实际分配的权限值 + /// + /// + public string GetActualAssignValue() + { + return AssignType == AssignTypeEnumType.Department ? TenantId + ":" + AssignValue : AssignValue; + } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Response/DevicePermissionAssignResponse.cs b/Src/Dlhis.Basic/Device/Response/DevicePermissionAssignResponse.cs index 01c0585a..79f8bdab 100644 --- a/Src/Dlhis.Basic/Device/Response/DevicePermissionAssignResponse.cs +++ b/Src/Dlhis.Basic/Device/Response/DevicePermissionAssignResponse.cs @@ -2,6 +2,12 @@ namespace Dlhis.Basic.Device.Response; public class DevicePermissionAssignResponse { + public DevicePermissionAssignResponse(int addCount, int deleteCount) + { + AddCount = addCount; + DeleteCount = deleteCount; + } + /// /// 添加数量 /// diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs index 43b4ea4a..0c8e3a67 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs @@ -13,14 +13,11 @@ public interface IDevicePermissionAnalyzeService : IScopeDependency { Task GenerateDeviceTasksAsync(Func func, List userNos); - Task>> GetAssignDeviceCodesInternalAsync(List userNos); - - Task>> GetAssignDeviceCodesInternalAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes); + Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes); Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request); Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request); - Task> GetAssignDeviceCodesAsync(string userCode); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 10ac7f8a..17b9d049 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -27,7 +27,7 @@ public interface IDevicePermissionService : IScopeDependency Task AssignToUniqueImportAsync(IFormFile file); - Task>> GetUserDevicePermissionsAsync(string code); + Task>> GetUserDevicePermissionsAsync(string code); /// /// 生成下发任务(主动生成) diff --git a/Src/Dlhis.Basic/Device/Services/IParallelService.cs b/Src/Dlhis.Basic/Device/Services/IParallelService.cs deleted file mode 100644 index 55f9471f..00000000 --- a/Src/Dlhis.Basic/Device/Services/IParallelService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Dlhis.Basic.Device.Services; - -public interface IParallelService : IScopeDependency -{ - public bool Enable { get; set; } -} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs index c2806f9e..e596cdce 100644 --- a/Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/IPermissionAnalyzeService.cs @@ -1,8 +1,17 @@ using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Response; namespace Dlhis.Basic.Device.Services; +/// +/// 权限分析 +/// public interface IPermissionAnalyzeService { - Task AnalyzeAsync(DevicePermissionSaveRequest request); + /// + /// 分析操作 + /// + /// + /// + Task AnalyzeAsync(DevicePermissionSaveRequest request); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index c48916ee..a2aabf0c 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -1,6 +1,7 @@ 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.Device.Entities; using Dlhis.Entity.Device.Enums; @@ -15,50 +16,52 @@ using SqlSugar; namespace Dlhis.Basic.Device.Services.Implements; +/// +/// 权限分析基类 +/// public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService { private readonly ICurrentUser _currentUser; - private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly IMyDataPermissionService _myDataPermissionService; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; + protected IDbContext DbContext { get; } protected BasePermissionAnalyzeService(IServiceProvider serviceProvider) { _currentUser = serviceProvider.GetService(); - _devicePermissionAnalyzeService = serviceProvider.GetService(); _myDataPermissionService = serviceProvider.GetService(); DbContext = serviceProvider.GetService(); CurrentTenantId = _currentUser.GetStringTenantId(); + _devicePermissionAnalyzeService = serviceProvider.GetService(); } private string CurrentTenantId { get; } - public ISugarQueryable DevicePermission => DbContext.Queryable(); + protected ISugarQueryable DevicePermission => DbContext.Queryable(); - - public async Task AnalyzeAsync(DevicePermissionSaveRequest request) + public async Task AnalyzeAsync(DevicePermissionSaveRequest request) { - var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; - - await CheckAssignTopDoorDeviceGroupAsync(request); + await CheckWhetherAssignToTopDeviceGroupAsync(request); + await CheckAssignedToTenantAsync(request); var dps = await GetAssignedDevicePermissionsAsync(request); (List codesToAdd, List codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes); if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty()) { - return; + return new DevicePermissionAssignResponse(0, 0); } var devicesToAdd = await DbContext.Queryable().Where(x => codesToAdd.Contains(x.Code)).Distinct().ToListAsync(); var devicesToDelete = await DbContext.Queryable().Where(x => codesToDelete.Contains(x.Code)).Distinct().ToListAsync(); - var gainfoNos = await GetGainfoNosAsync(currentAssignValue); + var gainfoNos = await GetGainfoNosAsync(request.GetActualAssignValue()); var userTenantDeviceCodes = devicesToDelete.IsPresent() && request.AssignType != AssignTypeEnumType.Tenant - ? await _devicePermissionAnalyzeService.GetAssignDeviceCodesInternalAsync(gainfoNos, request.AssignType) - : new Dictionary>(); + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.AssignType) + : new Dictionary>(); var tasks = new List(); foreach (var gainfoNo in gainfoNos) @@ -81,7 +84,7 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService if (userTenantDeviceCodes.Any()) { - var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.Codes).SelectMany(x => x.Codes); + 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(); } @@ -104,13 +107,58 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService await ChunkInsertAsync(tasks); await PersistDataAsync(dps, request); + + return new DevicePermissionAssignResponse(devicesToAdd.Count, devicesToDelete.Count); } - private async Task ChunkInsertAsync(List batch) where T : class, new() + + public async Task CheckAssignedToTenantAsync(DevicePermissionSaveRequest request) { - foreach (var tasks in batch.Chunk(500)) + if (request.AssignType != AssignTypeEnumType.Tenant) { - await DbContext.InsertAsync(tasks); + (request.Type == DeviceTypeEnumType.Meal).ThrowIfTrue("餐饮设备需分配到厂区级别"); + + if (request.UniqueType == DeviceAssignmentTypeEnumType.Device) + { + if (await DbContext.Queryable() + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device) + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => request.Codes.Contains(x.UniqueValue)) + .AnyAsync()) + { + true.ThrowIfTrue("存在设备分配到厂区中"); + } + } + + if (request.UniqueType == DeviceAssignmentTypeEnumType.Group) + { + var result = new List(); + var deviceGroups = await DbContext.Queryable().ToListAsync(); + request.Codes.ForEach(groupCode => result.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(groupCode, deviceGroups))); + + if (await DbContext.Queryable() + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => result.Contains(x.UniqueValue)) + .AnyAsync()) + { + true.ThrowIfTrue("存在设备组分配到厂区中"); + } + + var deviceCodes = await DbContext.Queryable() + .Where(x => result.Contains(x.GroupCode)) + .Select(x => x.DeviceCode).Distinct() + .ToListAsync(); + + if (await DbContext.Queryable() + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device) + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => deviceCodes.Contains(x.UniqueValue)) + .AnyAsync()) + { + true.ThrowIfTrue("设备组存在关联设备已分配到厂区中"); + } + } } } @@ -124,7 +172,19 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService // --------------------------------------------------------------------------------------------------------------------- // - private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request) + private async Task ChunkInsertAsync(List batch) where T : class, new() + { + foreach (var tasks in batch.Chunk(500)) + { + await DbContext.InsertAsync(tasks); + } + } + + /// + /// 检查是否分配顶级的设备分组 + /// + /// + private static async Task CheckWhetherAssignToTopDeviceGroupAsync(DevicePermissionSaveRequest request) { if (request.UniqueType == DeviceAssignmentTypeEnumType.Group) { @@ -140,18 +200,21 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService } } - + /// + /// 持久化数据 + /// + /// + /// private async Task PersistDataAsync(List dps, DevicePermissionSaveRequest request) { await DbContext.DeleteAsync(dps); //保存配置的权限 if (request.Codes.IsPresent()) { - var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity { AssignType = request.AssignType, - AssignValue = currentAssignValue, + AssignValue = request.GetActualAssignValue(), UniqueType = request.UniqueType, UniqueValue = code, Type = request.Type, @@ -165,7 +228,6 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService private List GetMyUniqueValues(DeviceAssignmentTypeEnumType uniqueType) { var searchAll = _currentUser.GetRole() is "admin" or "tenant-admin"; - //_myDataPermissionService if (!searchAll && uniqueType == DeviceAssignmentTypeEnumType.Device) { return _myDataPermissionService.GetMyDeviceCodes(); @@ -174,13 +236,17 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService return new List(); } + /// + /// 获取当前分配对应的现有权限 + /// + /// + /// private async Task> GetAssignedDevicePermissionsAsync(DevicePermissionSaveRequest request) { var myData = GetMyUniqueValues(request.UniqueType); - var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; return await DevicePermission.Where(x => x.AssignType == request.AssignType - && x.AssignValue == currentAssignValue + && x.AssignValue == request.GetActualAssignValue() && x.UniqueType == request.UniqueType && x.Type == request.Type && x.TenantId == CurrentTenantId) @@ -188,6 +254,13 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService .ToListAsync(); } + /// + /// 获取现在权限与当前的分配之间的deviceCode差异 + /// + /// + /// + /// + /// private async Task<(List, List)> GetDiffAsync(DeviceAssignmentTypeEnumType type, List dps, List uniqueValues) { var beforeCodes = dps.Select(x => x.UniqueValue).ToList(); @@ -196,8 +269,8 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService if (type == DeviceAssignmentTypeEnumType.Group) { var deviceGroups = await DbContext.Queryable().ToListAsync(); - beforeCodes = await GetDeviceCodeByGroupAsync(deviceGroups, beforeCodes); - presentCodes = await GetDeviceCodeByGroupAsync(deviceGroups, presentCodes); + beforeCodes = await GetDeviceCodeByGroupAsync(beforeCodes, deviceGroups); + presentCodes = await GetDeviceCodeByGroupAsync(presentCodes, deviceGroups); } var codesToAdd = presentCodes.Except(beforeCodes).ToList(); @@ -207,13 +280,16 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService } - private async Task> GetDeviceCodeByGroupAsync(List deviceGroups, List codes) + /// + /// 获取分组下的deviceCode + /// + /// + /// + /// + private async Task> GetDeviceCodeByGroupAsync(List codes, List deviceGroups) { var result = new List(); - foreach (var groupCode in codes) - { - result.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(groupCode, deviceGroups)); - } + codes.ForEach(groupCode => result.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(groupCode, deviceGroups))); result = result.Distinct().ToList(); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index a123326e..383fdb60 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -3,6 +3,8 @@ using Dlhis.Basic.Device.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; +using Dlhis.Entity.Sys.Entities; +using Dlhis.Entity.Sys.Enums; using Dlhis.Sys.Api; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; @@ -14,21 +16,19 @@ namespace Dlhis.Basic.Device.Services.Implements; public class DeviceGroupService : IDeviceGroupService { private readonly IDbContext _dbContext; - private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly ICurrentUser _currentUser; + private readonly INamedResolver _namedResolver; private readonly ITenantApi _tenantApi; - private readonly IParallelService _parallelService; public DeviceGroupService(IDbContext dbContext, - IDevicePermissionAnalyzeService devicePermissionAnalyzeService, ICurrentUser currentUser, - ITenantApi tenantApi, IParallelService parallelService) + INamedResolver namedResolver, + ITenantApi tenantApi) { _dbContext = dbContext; - _devicePermissionAnalyzeService = devicePermissionAnalyzeService; _currentUser = currentUser; + _namedResolver = namedResolver; _tenantApi = tenantApi; - _parallelService = parallelService; } @@ -105,24 +105,57 @@ public class DeviceGroupService : IDeviceGroupService await CheckNoNextGroupAsync(group.Code); await CheckGroupTypeMatchAsync(request, group); - _parallelService.Enable = true; - //下发任务 - await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => + var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); + await _dbContext.DeleteAsync(relationships); + + var entities = request.DeviceCodes.Select(x => new DeviceGroupRelationshipEntity { - var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); - await _dbContext.DeleteAsync(relationships); + GroupCode = request.GroupCode, + DeviceCode = x, - var entities = request.DeviceCodes.Select(x => new DeviceGroupRelationshipEntity + TenantId = _currentUser.GetStringTenantId(), + }).ToList(); + + await _dbContext.InsertAsync(entities); + + await PermissionResetAsync(request.GroupCode); + } + + private async Task PermissionResetAsync(Guid groupCode) + { + var deviceGroups = RecursionHelper.HandlerDeviceGroupPreviousCodes(groupCode, await _dbContext.Queryable().ToListAsync()); + + var dps = await _dbContext.Queryable() + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + .Where(x => deviceGroups.Contains(x.UniqueValue)) + .ToListAsync(); + + if (dps.Any()) + { + var type = dps.First().Type; + + foreach (var devicePermissionGroup in dps.GroupBy(x => new { x.AssignType, x.AssignValue, x.TenantId })) { - GroupCode = request.GroupCode, - DeviceCode = x, + var assignType = devicePermissionGroup.Key.AssignType; + var assignValue = devicePermissionGroup.Key.AssignValue; + var tenantId = devicePermissionGroup.Key.TenantId; + var analyzeService = _namedResolver.GetService(PermissionAnalyzeConstants.GetTypeName(assignType)); - TenantId = _currentUser.GetStringTenantId(), - }).ToList(); + var codes = devicePermissionGroup.Select(x => x.UniqueValue).Distinct().ToList(); - await _dbContext.InsertAsync(entities); - }, null); - _parallelService.Enable = false; + await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest + { + AssignType = assignType, + AssignValue = assignValue, + UniqueType = DeviceAssignmentTypeEnumType.Group, + Codes = codes, + TenantId = tenantId, + Type = type + }); + } + } + + } public async Task> GetDevicesByGroupCodeAsync(Guid code) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index 03267ad4..d82e09a7 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -1,5 +1,4 @@ using System.Collections.Concurrent; -using System.Runtime.CompilerServices; using Dlhis.Basic.DataPermissions; using Dlhis.Basic.Device.Dtos; using Dlhis.Basic.Device.Request; @@ -15,55 +14,34 @@ using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; -using SqlSugar; namespace Dlhis.Basic.Device.Services.Implements; public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService { private readonly IDbContext _dbContext; - private readonly IParallelService _parallelService; private readonly ICurrentUser _currentUser; - private readonly ILogger _logger; private readonly IMyDataPermissionService _myDataPermissionService; public DevicePermissionAnalyzeService(IDbContext dbContext, - IParallelService parallelService, ICurrentUser currentUser, - IMyDataPermissionService myDataPermissionService, - ILogger logger) + IMyDataPermissionService myDataPermissionService) { _dbContext = dbContext; - _parallelService = parallelService; _currentUser = currentUser; - _logger = logger; _myDataPermissionService = myDataPermissionService; } public async Task GenerateDeviceTasksAsync(Func func, List userNos) { - var getAllUser = userNos.IsEmpty(); - - //获取所有人的权限 - if (getAllUser) - userNos = await GetPermissionUserNosAsync(); - - var before = await GetAssignDeviceCodesInternalAsync(userNos); + var before = await GetUserAssignDeviceCodesInTenantAsync(userNos); //业务处理 _dbContext.Client.QueryFilter.Restore(); await func(); _dbContext.Client.QueryFilter.ClearAndBackup(); - //获取业务处理后所有人的权限 - if (getAllUser) - { - var nextUserNos = await GetPermissionUserNosAsync(); - if (nextUserNos.Any()) - userNos = userNos.Concat(nextUserNos).Distinct().ToList(); - } - - var current = await GetAssignDeviceCodesInternalAsync(userNos); + var current = await GetUserAssignDeviceCodesInTenantAsync(userNos); var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); @@ -72,10 +50,8 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService foreach (var userNo in userNos) { - before.TryGetValue(userNo, out var beforeTenantDeviceCodes); - beforeTenantDeviceCodes ??= new List(); - current.TryGetValue(userNo, out var currentTenantDeviceCodes); - currentTenantDeviceCodes ??= new List(); + var beforeTenantDeviceCodes = before[userNo].ToList(); + var currentTenantDeviceCodes = current[userNo].ToList(); var tenants = new HashSet(); foreach (var item in beforeTenantDeviceCodes) @@ -133,107 +109,14 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService await ChunkInsertAsync(waitAddTasks); await ChunkInsertAsync(waitDeleteTasks); - return new DevicePermissionAssignResponse - { - AddCount = waitAddTasks.Count, - DeleteCount = waitDeleteTasks.Count - }; + return new DevicePermissionAssignResponse(waitAddTasks.Count, waitDeleteTasks.Count); } - public async Task GenerateDeviceTasksV2Async(Func func, List userNos) - { - var before = await GetAssignDeviceCodesInternalAsync(userNos); - //业务处理 - await _dbContext.IgnoreAsync(async () => { await func(); }); - - var current = await GetAssignDeviceCodesInternalAsync(userNos); - - var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); - - var waitAddTasks = new List(); - var waitDeleteTasks = new List(); - - foreach (var userNo in userNos) - { - before.TryGetValue(userNo, out var beforeTenantDeviceCodes); - beforeTenantDeviceCodes ??= new List(0); - current.TryGetValue(userNo, out var currentTenantDeviceCodes); - currentTenantDeviceCodes ??= new List(0); - - var tenants = new HashSet(); - foreach (var item in beforeTenantDeviceCodes) - tenants.Add(item.Tenant); - foreach (var item in currentTenantDeviceCodes) - tenants.Add(item.Tenant); - - foreach (var tenant in tenants) - { - var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); - var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes?.ToList() ?? new List(); - - var addItems = currentCodes.Except(beforeCodes).ToList(); - var deletedItems = beforeCodes.Except(currentCodes).ToList(); - - if (!deletedItems.Any() && !addItems.Any()) - { - continue; - } - - //下发任务创建 - deletedItems.ForEach(x => waitDeleteTasks.Add(new DeviceTaskEntity - { - DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Type = DeviceTaskEnumType.Delete, - CancellationId = 0, - DeviceType = devices.First(item => item.Code == x).Type, - UserNo = userNo, - Version = 0, - TenantId = tenant, - Source = DeviceTaskSourceEnumType.Manually - })); - - addItems.ForEach(x => waitAddTasks.Add(new DeviceTaskEntity - { - DeviceUniqueNo = devices.First(item => item.Code == x).UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Type = DeviceTaskEnumType.Add, - DeviceType = devices.First(item => item.Code == x).Type, - UserNo = userNo, - Version = 0, - TenantId = tenant, - Source = DeviceTaskSourceEnumType.Manually - })); - } - } - - await ChunkInsertAsync(waitAddTasks); - await ChunkInsertAsync(waitDeleteTasks); - - return new DevicePermissionAssignResponse - { - AddCount = waitAddTasks.Count, - DeleteCount = waitDeleteTasks.Count - }; - } - - private async Task ChunkInsertAsync(List batch) where T : class, new() - { - foreach (var tasks in batch.Chunk(500)) - { - await _dbContext.InsertAsync(tasks.ToList()); - } - } - - - public async Task>> GetAssignDeviceCodesInternalAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes) + public async Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes) { var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); - if (!gainfos.Any()) - { - return new Dictionary>(); - } + if (!gainfos.Any()) return new Dictionary>(); var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); @@ -247,318 +130,75 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService var deviceRelationships = await _dbContext.Queryable().ToListAsync(); var departments = await _dbContext.Queryable().ToListAsync(); - var result = new ConcurrentDictionary>(); - //var total = gainfos.Count; + var result = new ConcurrentDictionary>(); gainfos.ParallelForEach(gainfo => { - var gainfoDto = new GainfoDto + var internalIgnoreAssignTypes = new List(); + internalIgnoreAssignTypes.AddRange(ignoreAssignTypes); + if (gainfo.Type == GainfoUserTypeEnumType.Outsource && (enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true) == false) { - Id = gainfo.Id, - No = gainfo.No, - Code = gainfo.Code, - Name = gainfo.Name, - Workplace = gainfo.Workplace, - Factory = gainfo.Factory, - DepartmentNo = gainfo.DepartmentNo, - IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, - EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true + internalIgnoreAssignTypes.Add(AssignTypeEnumType.Tenant); + } + + var analyzePack = new AnalyzePackDto + { + UserNo = gainfo.No, + UserDepartment = gainfo.Factory + ":" + gainfo.DepartmentNo, + 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), //外包人员不允许餐饮 + IgnoreAssignTypeTypes = internalIgnoreAssignTypes }; - var codes = GetAssignDeviceCodesInternal2(gainfoDto, gainfoGroups, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, devices, departments, ignoreAssignTypes); - result.TryAdd(gainfo.No, codes); + var codes = GetAssignDeviceCodesInternal(analyzePack, + gainfoGroups, + devicePermissions, + deviceGroups, + deviceRelationships, + departments); - // Interlocked.Decrement(ref total); - // _logger.LogInformation("剩余:{count}", total); + result.TryAdd(gainfo.No, codes); }); return result.ToDictionary(x => x.Key, x => x.Value); } - public async Task>> GetAssignDeviceCodesInternalAsync(List userNos) - { - var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); - var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList(); - var registries = await _dbContext.Queryable() - .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) - .Where(x => !SqlFunc.IsNullOrEmpty(x.BusinessPlaceCode)) - .ToListAsync(); - - var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); - if (!gainfos.Any()) - { - return new Dictionary>(); - } - - var enableFactoryPermissions = await _dbContext.Queryable().ToListAsync(); - - var gainfoGroupRelationships = await _dbContext.Queryable().Where(x => userNos.Contains(x.UserNo)).ToListAsync(); - var devicePermissions = await _dbContext.Queryable().ToListAsync(); - var deviceGroups = await _dbContext.Queryable().ToListAsync(); - var deviceRelationships = await _dbContext.Queryable().ToListAsync(); - var departments = await _dbContext.Queryable().ToListAsync(); - - if (_parallelService.Enable) - { - var result = new ConcurrentDictionary>(); - var total = gainfos.Count; - Parallel.ForEach(gainfos, new ParallelOptions { MaxDegreeOfParallelism = 4 }, gainfo => - { - var gainfoDto = new GainfoDto - { - Id = gainfo.Id, - No = gainfo.No, - Code = gainfo.Code, - Name = gainfo.Name, - Workplace = gainfo.Workplace, - Factory = gainfo.Factory, - DepartmentNo = gainfo.DepartmentNo, - IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, - EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true - }; - - var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); - result.TryAdd(gainfo.No, codes); - - Interlocked.Decrement(ref total); - _logger.LogInformation("剩余:{count}", total); - }); - - return result.ToDictionary(x => x.Key, x => x.Value); - } - else - { - var result = new Dictionary>(); - var total = gainfos.Count; - foreach (var gainfo in gainfos) - { - var gainfoDto = new GainfoDto - { - Id = gainfo.Id, - No = gainfo.No, - Code = gainfo.Code, - Name = gainfo.Name, - Workplace = gainfo.Workplace, - Factory = gainfo.Factory, - DepartmentNo = gainfo.DepartmentNo, - IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, - EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true - }; - - var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); - result.Add(gainfo.No, codes); - total--; - _logger.LogInformation("剩余:{count}", total); - } - - return result; - } - } - - public async Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request) - { - request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; - var role = _currentUser.GetRole(); - var isAll = role is "admin" or "tenant-admin"; - var deviceCodes = _myDataPermissionService.GetMyDeviceCodes(); - - return await _dbContext.Queryable() - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.AssignValue == request.AssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Select(x => x.UniqueValue) - .ToListAsync(); - } - - public async Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request) - { - var nos = await _dbContext.Queryable() - .Where(x => x.UniqueType == request.UniqueType) - .Where(x => x.UniqueValue == request.UniqueValue) - .Where(x => x.AssignType == AssignTypeEnumType.User) - .Where(x => x.Type == request.Type) - .Select(x => x.AssignValue) - .ToListAsync(); - - return await _dbContext.Queryable().Where(x => nos.Contains(x.No)).Select(x => new GainfoDto - { - Id = x.Id, - Code = x.Code, - Name = x.Name, - Workplace = x.Workplace, - Factory = x.Factory - }).ToListAsync(); - } - - public async Task> GetAssignDeviceCodesAsync(string userCode) - { - var userNo = await _dbContext.Queryable().Where(x => x.Code == userCode || x.No == userCode).Select(x => x.No).SingleAsync(); - var result = await GetAssignDeviceCodesInternalAsync(new List { userNo }); - return result.First().Value.SelectMany(x => x.Codes).ToList(); - } - - private static List GetAssignDeviceCodesInternal( - GainfoDto gainfo, - List gainfoGroupRelationships, - List devicePermissions, - List deviceGroups, - List deviceGroupRelationships, - List deviceRegistries, - List devices, List departments) - { - if (gainfo.IsOutsource) - { - //外包人员不允许餐饮 - devices = devices.Where(x => x.Type != DeviceTypeEnumType.Meal).ToList(); - } - - var userNo = gainfo.No; - - var deviceDtos = new List(); - var deviceGroupDtos = new List(); - var businessPlaceDtos = new List(); - - //获取人员的分组,跨基地 - var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToList(); - - //按用户 - var du = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo); - var gu = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo); - var pu = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.User, userNo); - deviceDtos.AddRange(du); - deviceGroupDtos.AddRange(gu); - businessPlaceDtos.AddRange(pu); - - //按用户组 - foreach (var groupCode in gainfoGroups) - { - var dg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, groupCode.ToString()); - var gg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, groupCode.ToString()); - var pg = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Group, groupCode.ToString()); - deviceDtos.AddRange(dg); - deviceGroupDtos.AddRange(gg); - businessPlaceDtos.AddRange(pg); - } - - //按部门 - var currentAssignValue = gainfo.Factory + ":" + gainfo.DepartmentNo; - var dd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, currentAssignValue); - var gd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, currentAssignValue); - var pd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Department, currentAssignValue); - deviceDtos.AddRange(dd); - deviceGroupDtos.AddRange(gd); - businessPlaceDtos.AddRange(pd); - - //按厂区 - if (!gainfo.IsOutsource || gainfo.EnableFactoryPermission) - { - var dt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory); - var gt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory); - var pt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Tenant, gainfo.Factory); - deviceDtos.AddRange(dt); - deviceGroupDtos.AddRange(gt); - businessPlaceDtos.AddRange(pt); - } - - var deviceGroupCodes = deviceGroupDtos.SelectMany(x => x.Codes).Distinct().ToList(); - var businessPlaceCodes = businessPlaceDtos.SelectMany(x => x.Codes).Distinct().ToList(); - - var deviceCodesByGroup = deviceGroupRelationships.Where(x => deviceGroupCodes.Contains(x.GroupCode)) - .GroupBy(x => x.TenantId) - .Select(x => new UserTenantDeviceCodeDto - { - Tenant = x.Key, - Codes = x.Select(item => item.DeviceCode).Distinct().ToList() - }); - - var placeGroup = deviceRegistries.Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode!.Value)) - .GroupBy(x => x.TenantId) - .Select(x => - { - var currentDeviceUniqueNos = x.Select(item => item.DeviceUniqueNo).ToList(); - - return new UserTenantDeviceCodeDto - { - Tenant = x.Key, - Codes = devices.Where(d => currentDeviceUniqueNos.Contains(d.UniqueNo)).Select(d => d.Code).Distinct().ToList() - }; - }).ToList(); - - deviceDtos.AddRange(deviceCodesByGroup); - deviceDtos.AddRange(placeGroup); - - return deviceDtos.GroupBy(x => x.Tenant).Select(x => - { - var dto = new UserTenantDeviceCodeDto - { - Tenant = x.Key, - Codes = x.SelectMany(item => item.Codes).Distinct().ToList() - }; - - dto.Codes = dto.Codes.Where(p => devices.Any(item => item.Code == p)).ToList(); - - return dto; - }).ToList(); - } - - public static List GetAssignDeviceCodesInternal2( - GainfoDto gainfo, + private static IEnumerable GetAssignDeviceCodesInternal( + AnalyzePackDto analyzePack, List gainfoGroups, - List gainfoGroupRelationships, List devicePermissions, List deviceGroups, List deviceGroupRelationships, - List devices, List departments, params AssignTypeEnumType[] ignoreAssignTypes) + List departments) { - if (gainfo.IsOutsource) - { - //外包人员不允许餐饮 - devices = devices.Where(x => x.Type != DeviceTypeEnumType.Meal).ToList(); - } - - var deviceCodes = devices.Select(x => x.Code).ToList(); - var deviceDtos = new List(); var deviceGroupDtos = new List(); - //获取人员的分组,跨基地 - var myGainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == gainfo.No).Select(x => x.GroupCode).ToList(); - - if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.User)) + foreach (var assignType in new[] { AssignTypeEnumType.User, AssignTypeEnumType.Group, AssignTypeEnumType.Department, AssignTypeEnumType.Tenant }) { - //按用户 - deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, gainfo.No)); - deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, gainfo.No)); - } - - if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.Group)) - { - //按用户组 - foreach (var groupCode in myGainfoGroups) + var assignValues = assignType switch { - deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, groupCode.ToString())); - deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, groupCode.ToString())); + AssignTypeEnumType.User => new[] { analyzePack.UserNo }, + AssignTypeEnumType.Group => analyzePack.UserGainfoGroupCodes.Select(x => x.ToString()).ToArray(), + AssignTypeEnumType.Department => new[] { analyzePack.UserDepartment }, + AssignTypeEnumType.Tenant => new[] { analyzePack.UserFactory }, + AssignTypeEnumType.Role => throw new ArgumentOutOfRangeException(), + _ => throw new ArgumentOutOfRangeException() + }; + + if (analyzePack.IgnoreAssignTypeTypes.Contains(assignType)) + { + continue; } - } - if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.Department)) - { - //按部门 - var currentAssignValue = gainfo.Factory + ":" + gainfo.DepartmentNo; - deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, currentAssignValue)); - deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, currentAssignValue)); - } - - if (ignoreAssignTypes.IsEmpty() || !ignoreAssignTypes.Contains(AssignTypeEnumType.Tenant)) - { - //按厂区 - if (!gainfo.IsOutsource || gainfo.EnableFactoryPermission) + foreach (var assignValue in assignValues) { - deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory)); - deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory)); + deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, + DeviceAssignmentTypeEnumType.Device, assignType, assignValue)); + deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, + DeviceAssignmentTypeEnumType.Group, assignType, assignValue)); } } @@ -567,17 +207,17 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService { var tenant = x.Tenant; - var deviceGroupCodes = x.Codes.SelectMany(item => item.Codes); - var type = x.Codes.ElementAt(0).AssignType; + var deviceGroupCodes = x.AssignTypes.SelectMany(item => item.Codes); + var type = x.AssignTypes.ElementAt(0).AssignType; return new TenantAssignTypeDeviceCode { Tenant = tenant, - Codes = new List + AssignTypes = new[] { - new() + new AssignTypeDeviceCode { AssignType = type, - Codes = deviceGroupRelationships.Where(item => deviceGroupCodes.Contains(item.GroupCode)).Select(item => item.DeviceCode).ToList() + Codes = deviceGroupRelationships.Where(item => deviceGroupCodes.Contains(item.GroupCode)).Select(item => item.DeviceCode) } } }; @@ -588,69 +228,17 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService var dto = new TenantAssignTypeDeviceCode { Tenant = x.Key, - Codes = x.SelectMany(p => p.Codes) + AssignTypes = x.SelectMany(p => p.AssignTypes) .GroupBy(p => p.AssignType) .Select(p => new AssignTypeDeviceCode { AssignType = p.Key, - Codes = p.SelectMany(item => deviceCodes.Where(it => item.Codes.Contains(it))) + Codes = p.SelectMany(item => analyzePack.DeviceCodes.Where(it => item.Codes.Contains(it))) }) }; return dto; - }).ToList(); - } - - private static List GetAssignCodesInternal( - List devicePermissions, List deviceGroups, List departments, - DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) - { - var tenantDevicePermissions = devicePermissions - .Where(x => x.UniqueType == uniqueType - && x.AssignType == assignType - && x.AssignValue == assignValue) - .GroupBy(x => x.TenantId) - .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) - .ToList(); - - //处理获取设备分组的情况 - if (uniqueType == DeviceAssignmentTypeEnumType.Group) - { - //开始递归处理 - var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList(); - tops.ForEach(x => { DeviceGroupRecursionGetNext(x, deviceGroups, tenantDevicePermissions, tenantDevicePermissions.SelectMany(item => item.Codes).Contains(x.Code)); }); - } - - if (assignType == AssignTypeEnumType.Department) - { - //递归向上获取 assignValue = department.No - var arr = assignValue.Split(":"); - var tenantId = arr.First(); - var currentDepartmentNo = arr.Last(); - var departmentNos = new List(12) { currentDepartmentNo }; - DepartmentRecursionGetPNo(currentDepartmentNo, departments, departmentNos); - - departmentNos = departmentNos.Select(x => tenantId + ":" + x).ToList(); - - tenantDevicePermissions = 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(); - } - - return tenantDevicePermissions.GroupBy(x => x.Tenant).Select(x => - { - var tenant = x.Key; - - return new UserTenantDeviceCodeDto - { - Tenant = tenant, - Codes = x.SelectMany(item => item.Codes).ToList() - }; - }).ToList(); + }); } private static List GetCurrentAssignTypePermissions( @@ -661,7 +249,6 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService AssignTypeEnumType assignType, string assignValue) { - //处理分配到部门 if (assignType == AssignTypeEnumType.Department) { // 2401:00001 @@ -695,15 +282,16 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService //user / tenant return devicePermissions - .Where(x => x.UniqueType == uniqueType //设备/设备组 - && x.AssignType == assignType // user/group/department/tenant + .Where(x => x.UniqueType == uniqueType + && x.AssignType == assignType && x.AssignValue == assignValue) .GroupBy(x => x.TenantId) .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) .ToList(); } - private static List GetMyTypeDevicePermissionAsync( + + private static IEnumerable GetMyTypeDevicePermissionAsync( List devicePermissions, List gainfoGroups, List deviceGroups, @@ -736,120 +324,83 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService return new TenantAssignTypeDeviceCode { Tenant = tenant, - Codes = new List + AssignTypes = new[] { - new() + new AssignTypeDeviceCode { AssignType = assignType, - Codes = x.SelectMany(item => item.Codes), + Codes = x.SelectMany(item => item.Codes) } } }; - }).ToList(); + }); } - /// - /// 获取当前基地有权限的用户 - /// - /// - private async Task> GetPermissionUserNosAsync() + private async Task ChunkInsertAsync(List batch) where T : class, new() { - var permissions = await _dbContext.Queryable().ToListAsync(); + foreach (var tasks in batch.Chunk(500)) + { + await _dbContext.InsertAsync(tasks.ToList()); + } + } - //User - var userNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.User) + + public async Task>> GetUserAssignDeviceCodesInTenantAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes) + { + var result = await GetUserAssignDeviceCodesWithTypeInTenantAsync(userNos, ignoreAssignTypes); + + return result.ToDictionary(x => x.Key, x => x.Value.GroupBy(p => p.Tenant).Select(item => + { + return new UserTenantDeviceCodeDto + { + Tenant = item.Key, + Codes = item.SelectMany(p => p.AssignTypes).SelectMany(p => p.Codes).Distinct().ToList(), + }; + })); + } + + + public async Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request) + { + 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(); + + 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)) + .Where(x => x.Type == request.Type) + .Select(x => x.UniqueValue) + .ToListAsync(); + } + + public async Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request) + { + var nos = await _dbContext.Queryable() + .Where(x => x.UniqueType == request.UniqueType) + .Where(x => x.UniqueValue == request.UniqueValue) + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.Type == request.Type) .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) + return await _dbContext.Queryable().Where(x => nos.Contains(x.No)).Select(x => new GainfoDto { - var departmentNosToSearch = new List(); - foreach (var d in departmentNos) - { - departmentNosToSearch.Add(d); - RecursionGetNextAllDepartment(d, departments, departmentNosToSearch); - } - - 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 => tenants.Contains(x.Factory)).Select(x => x.No).ToListAsync(); - - return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).Distinct().ToList(); - - void RecursionGetNextAllDepartment(string current, List data, List result) - { - var next = data.Where(x => x.PNo == current); - foreach (var item in next.Select(x => x.No)) - { - result.Add(item); - RecursionGetNextAllDepartment(item, data, result); - } - } + Id = x.Id, + Code = x.Code, + Name = x.Name, + Workplace = x.Workplace, + Factory = x.Factory + }).ToListAsync(); } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void DepartmentRecursionGetPNo(string current, List data, List result) + public async Task> GetAssignDeviceCodesAsync(string userCode) { - var p = data.FirstOrDefault(x => x.No == current)?.PNo; - if (!p.IsPresent()) - { - return; - } - - result.Add(p); - DepartmentRecursionGetPNo(p, data, result); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void DeviceGroupRecursionGetNext(DeviceGroupEntity current, List currentDeviceGroups, List result, bool add) - { - var next = currentDeviceGroups.Where(x => x.PCode == current.Code).ToList(); - foreach (var item in next) - { - if (add) - { - result.Add(new UserTenantDeviceCodeDto { Tenant = item.TenantId, Codes = new List { item.Code } }); - } - - DeviceGroupRecursionGetNext(item, currentDeviceGroups, result, result.SelectMany(x => x.Codes).Contains(item.Code)); - } + var userNo = await _dbContext.Queryable().Where(x => x.Code == userCode || x.No == userCode).Select(x => x.No).SingleAsync(); + var result = await GetUserAssignDeviceCodesInTenantAsync(new List { userNo }); + return result.First().Value.SelectMany(x => x.Codes).ToList(); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index c0a38b64..fa057727 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -1,5 +1,4 @@ -using Dlhis.Basic.DataPermissions; -using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.Dtos; using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Entity.Basic.Entity; @@ -11,10 +10,8 @@ using Dlhis.Entity.Visitor.Entity; using Dlhis.Sys.Api; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.Dto; -using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; -using Kurisu.AspNetCore.Scope; using Kurisu.AspNetCore.Utils.Extensions; using OfficeOpenXml; using SqlSugar; @@ -24,25 +21,19 @@ namespace Dlhis.Basic.Device.Services.Implements; public class DevicePermissionService : IDevicePermissionService { private readonly IDbContext _dbContext; - private readonly IMyDataPermissionService _myDataPermissionService; private readonly ITenantApi _tenantApi; - private readonly IParallelService _parallelService; private readonly INamedResolver _namedResolver; private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly ICurrentUser _currentUser; public DevicePermissionService(IDbContext dbContext, - IMyDataPermissionService myDataPermissionService, ITenantApi tenantApi, - IParallelService parallelService, INamedResolver namedResolver, IDevicePermissionAnalyzeService devicePermissionAnalyzeService, ICurrentUser currentUser) { _dbContext = dbContext; - _myDataPermissionService = myDataPermissionService; _tenantApi = tenantApi; - _parallelService = parallelService; _namedResolver = namedResolver; _devicePermissionAnalyzeService = devicePermissionAnalyzeService; _currentUser = currentUser; @@ -50,252 +41,9 @@ public class DevicePermissionService : IDevicePermissionService public async Task AssignAsync(DevicePermissionSaveRequest request) { - await _namedResolver.GetService(PermissionAnalyzeConstants.GetTypeName(request.AssignType)).AnalyzeAsync(request); - - return null; - await CheckAssignTopDoorDeviceGroupAsync(request); - - var currentTenantId = _currentUser.GetStringTenantId(); - var role = _currentUser.GetRole(); - var isAll = role is "admin" or "tenant-admin"; - var deviceCodes = isAll ? new List() : _myDataPermissionService.GetMyDeviceCodes(); - - _parallelService.Enable = true; - return await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => - { - request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; - - await _dbContext.IgnoreAsync(async () => - { - //删除当前匹配的基地权限 - var p = await _dbContext.Queryable() - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.AssignValue == request.AssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Where(x => x.TenantId == currentTenantId) - .ToListAsync(); - - await _dbContext.DeleteAsync(p); - - //保存配置的权限 - if (request.Codes.IsPresent()) - { - var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity - { - AssignType = request.AssignType, - AssignValue = request.AssignValue, - UniqueType = request.UniqueType, - UniqueValue = code, - Type = request.Type, - TenantId = currentTenantId - }).ToList(); - - await _dbContext.InsertAsync(devicePermissions); - } - }); - }, null); - } - - - private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request) - { - if (request.UniqueType == DeviceAssignmentTypeEnumType.Group) - { - await Scoped.Temp.Value.CreateAsync(async sp => - { - var currentDb = sp.GetService(); - await currentDb.IgnoreAsync(async () => - { - var dgs = await currentDb.Queryable().Where(x => request.Codes.Contains(x.Code)).ToListAsync(); - dgs.Any(x => x.TenantId.IsEmpty()).ThrowIfTrue("不可分配顶级分组节点"); - }); - }); - } - } - - - public async Task GenerateTasksAsync(List addDeviceCodes, List deleteDeviceCodes, List gainfoNos) - { - var allDeviceCodes = addDeviceCodes.Concat(deleteDeviceCodes).ToList(); - var devices = await _dbContext.Queryable() - .Where(x => allDeviceCodes.Contains(x.Code)) - .Select(x => new { x.Code, x.UniqueNo, x.Type, x.TenantId }) - .ToListAsync(); - - var tasks = new List(); - foreach (var gainfoNo in gainfoNos) - { - tasks.AddRange(addDeviceCodes.Select(x => - { - var d = devices.First(item => item.Code == x); - return new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Add, - DeviceType = d.Type, - UserId = null, - UserNo = gainfoNo, - DeviceUniqueNo = d.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = d.TenantId, - }; - }).ToList()); - - tasks.AddRange(deleteDeviceCodes.Select(x => - { - var d = devices.First(item => item.Code == x); - return new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Delete, - DeviceType = d.Type, - UserId = null, - UserNo = gainfoNo, - DeviceUniqueNo = d.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = d.TenantId, - }; - }).ToList()); - } - - foreach (var items in tasks.Where(x => x.Type == DeviceTaskEnumType.Add).Chunk(500)) - { - await _dbContext.InsertAsync(items.ToList()); - } - - return new DevicePermissionAssignResponse - { - AddCount = addDeviceCodes.Count * gainfoNos.Count, - DeleteCount = deleteDeviceCodes.Count * gainfoNos.Count - }; - } - - - public async Task AssignDeviceGroupToTenantAsync(string currentTenantId, DevicePermissionSaveRequest request) - { - var groupData = await _dbContext.Queryable() - .Where(x => x.AssignType == AssignTypeEnumType.Tenant) - .Where(x => x.AssignValue == request.AssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .Where(x => x.Type == request.Type) - .Where(x => x.TenantId == currentTenantId) - .ToListAsync(); - - var gainfoNos = await _dbContext.Queryable().Where(x => x.Factory == request.AssignValue).Select(x => x.No).ToListAsync(); - - var beforeDeviceCodes = groupData.Select(x => x.UniqueValue).ToList(); - var presentDeviceCodes = request.Codes.IsPresent() ? request.Codes : new List(); - - var addDeviceGroupCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); - var deleteDeviceGroupCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); - - await _dbContext.DeleteAsync(groupData); - //保存配置的权限 - if (request.Codes.IsPresent()) - { - var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity - { - AssignType = request.AssignType, - AssignValue = request.AssignValue, - UniqueType = request.UniqueType, - UniqueValue = code, - Type = request.Type, - TenantId = currentTenantId - }).ToList(); - - await _dbContext.InsertAsync(devicePermissions); - } - - var deviceGroups = await _dbContext.Queryable().ToListAsync(); - - var addDevices = await GetDevicesByGroupsAsync(deviceGroups, deviceGroups.Where(x => addDeviceGroupCodes.Contains(x.Code)).ToList()); - var deleteDevices = await GetDevicesByGroupsAsync(deviceGroups, deviceGroups.Where(x => deleteDeviceGroupCodes.Contains(x.Code)).ToList()); - - var tasks = new List(); - foreach (var gainfoNo in gainfoNos) - { - tasks.AddRange(addDevices.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(deleteDevices.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()); - } - - foreach (var items in tasks.Where(x => x.Type == DeviceTaskEnumType.Add).Chunk(500)) - { - await _dbContext.InsertAsync(items.ToList()); - } - - return new DevicePermissionAssignResponse - { - AddCount = addDevices.Count * gainfoNos.Count, - DeleteCount = deleteDevices.Count * gainfoNos.Count - }; - } - - private static void RecursionGetNextDeviceGroup(List allData, DeviceGroupEntity current, List result) - { - var nextItems = allData.Where(x => x.PCode == current.Code).ToList(); - foreach (var item in nextItems) - { - result.Add(item.Code); - RecursionGetNextDeviceGroup(allData, item, result); - } - } - - private async Task> GetDevicesByGroupsAsync(List allData, List groups) - { - var result = new List(); - foreach (var group in groups) - { - result.Add(group.Code); - RecursionGetNextDeviceGroup(allData, group, result); - } - - var deviceCodes = await _dbContext.Queryable() - .Where(x => result.Contains(x.GroupCode)) - .Select(x => x.DeviceCode) - .ToListAsync(); - - return await _dbContext.Queryable() - .Where(x => deviceCodes.Contains(x.Code)) - .ToListAsync(); + return await _namedResolver + .GetService(PermissionAnalyzeConstants.GetTypeName(request.AssignType)) + .AnalyzeAsync(request); } public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) @@ -475,10 +223,19 @@ public class DevicePermissionService : IDevicePermissionService } /// - public async Task>> GetUserDevicePermissionsAsync(string code) + public async Task>> GetUserDevicePermissionsAsync(string code) { var userNo = await _dbContext.Queryable().Where(x => x.Code == code).Select(x => x.No).SingleAsync(); - return await _devicePermissionAnalyzeService.GetAssignDeviceCodesInternalAsync(new List { userNo }); + var result = await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(new List { userNo }); + + return result.ToDictionary(x => x.Key, x => x.Value.GroupBy(p => p.Tenant).Select(item => + { + return new UserTenantDeviceCodeDto + { + Tenant = item.Key, + Codes = item.SelectMany(p => p.AssignTypes).SelectMany(p => p.Codes).Distinct().ToList(), + }; + })); } @@ -701,7 +458,7 @@ public class DevicePermissionService : IDevicePermissionService public async Task> GetAssignDeviceCodesAsync(string userCode) { var userNo = await _dbContext.Queryable().Where(x => x.Code == userCode || x.No == userCode).Select(x => x.No).SingleAsync(); - var result = await _devicePermissionAnalyzeService.GetAssignDeviceCodesInternalAsync(new List { userNo }); - return result.First().Value.SelectMany(x => x.Codes).ToList(); + var result = await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(new List { userNo }); + return result.First().Value.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList(); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/ParallelService.cs b/Src/Dlhis.Basic/Device/Services/Implements/ParallelService.cs deleted file mode 100644 index 469b940d..00000000 --- a/Src/Dlhis.Basic/Device/Services/Implements/ParallelService.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Dlhis.Basic.Device.Services.Implements; - -public class ParallelService : IParallelService -{ - /// - public bool Enable { get; set; } -} \ No newline at end of file diff --git a/Src/Dlhis.Basic/ObfuscateProviderJsonConverter.cs b/Src/Dlhis.Basic/ObfuscateProviderJsonConverter.cs index a76eb20c..59d1ec5d 100644 --- a/Src/Dlhis.Basic/ObfuscateProviderJsonConverter.cs +++ b/Src/Dlhis.Basic/ObfuscateProviderJsonConverter.cs @@ -1,7 +1,7 @@ using System.Security.Claims; using Kurisu.AspNetCore; using Kurisu.AspNetCore.Authentication.Abstractions; -using Kurisu.AspNetCore.Utils; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.Utils.Converters; using Newtonsoft.Json; diff --git a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs index 177f1f0c..2e9b5f23 100644 --- a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs +++ b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs @@ -1,4 +1,6 @@ -namespace Dlhis.Basic.Organization.Dto; +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Basic.Organization.Dto; public class GainfoDto { @@ -15,4 +17,17 @@ public class GainfoDto public bool IsOutsource { get; set; } public bool EnableFactoryPermission { get; set; } +} + +public class AnalyzePackDto +{ + public string UserNo { get; set; } + public string UserDepartment { get; set; } + public string UserFactory { get; set; } + + public IEnumerable UserGainfoGroupCodes { get; set; } + + public IEnumerable DeviceCodes { get; set; } + + public IEnumerable IgnoreAssignTypeTypes { 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 5cd582d7..dd195f8b 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -1,7 +1,11 @@ -using Dlhis.Basic.Device.Services; +using Dlhis.Basic.Device; +using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Services; using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Sys.Entities; +using Dlhis.Entity.Sys.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; @@ -13,13 +17,13 @@ public class GainfoGroupService : IGainfoGroupService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; - private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; + private readonly INamedResolver _namedResolver; - public GainfoGroupService(IDbContext dbContext, ICurrentUser currentUser, IDevicePermissionAnalyzeService devicePermissionAnalyzeService) + public GainfoGroupService(IDbContext dbContext, ICurrentUser currentUser, INamedResolver namedResolver) { _dbContext = dbContext; _currentUser = currentUser; - _devicePermissionAnalyzeService = devicePermissionAnalyzeService; + _namedResolver = namedResolver; } public async Task> GetTreeAsync() @@ -82,28 +86,60 @@ public class GainfoGroupService : IGainfoGroupService var existsNextGroup = await _dbContext.Queryable().Where(x => x.PCode == request.GroupCode).AnyAsync(); existsNextGroup.ThrowIfTrue("存在下级分组,无法分配人员"); - await _devicePermissionAnalyzeService.GenerateDeviceTasksAsync(async () => + var relations = await _dbContext.Queryable() + .Where(x => x.GroupCode == request.GroupCode) + .ToListAsync(); + await _dbContext.DeleteAsync(relations); + + var userNos = await _dbContext.Queryable() + .Where(x => request.UserNos.Contains(x.No) || request.UserNos.Contains(x.Code)) //NO和工号匹配 + .Select(x => x.No) + .ToListAsync(); + + //(userNos.Count != request.UserNos.Count).ThrowIfTrue("存在权限外人员,无法添加"); + + var entities = userNos.Select(x => new GainfoGroupRelationshipEntity { - var relations = await _dbContext.Queryable() - .Where(x => x.GroupCode == request.GroupCode) - .ToListAsync(); - await _dbContext.DeleteAsync(relations); + GroupCode = request.GroupCode, + UserNo = x + }).ToList(); - var userNos = await _dbContext.Queryable() - .Where(x => request.UserNos.Contains(x.No) || request.UserNos.Contains(x.Code)) //NO和工号匹配 - .Select(x => x.No) - .ToListAsync(); + await _dbContext.InsertAsync(entities); - //(userNos.Count != request.UserNos.Count).ThrowIfTrue("存在权限外人员,无法添加"); + await PermissionResetAsync(request.GroupCode); + } - var entities = userNos.Select(x => new GainfoGroupRelationshipEntity + + private async Task PermissionResetAsync(Guid groupCode) + { + var gainfoGroups = RecursionHelper.HandlerGainfoGroupPreviousCodes(groupCode, await _dbContext.Queryable().ToListAsync()).Select(x => x.ToString()); + + var dps = await _dbContext.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.Group) + .Where(x => gainfoGroups.Contains(x.AssignValue)) + .ToListAsync(); + + var analyzeService = _namedResolver.GetService(PermissionAnalyzeConstants.GetTypeName(AssignTypeEnumType.Group)); + + foreach (var devicePermissionGroup in dps.GroupBy(x => new { x.AssignValue, x.TenantId, x.UniqueType, x.Type })) + { + var assignValue = devicePermissionGroup.Key.AssignValue; + var tenantId = devicePermissionGroup.Key.TenantId; + var uniqueType = devicePermissionGroup.Key.UniqueType; + var type = devicePermissionGroup.Key.Type; + + var codes = devicePermissionGroup.Select(x => x.UniqueValue).Distinct().ToList(); + + await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest { - GroupCode = request.GroupCode, - UserNo = x - }).ToList(); - - await _dbContext.InsertAsync(entities); - }, null); + AssignType = AssignTypeEnumType.Group, + AssignValue = assignValue, + UniqueType = uniqueType, + Codes = codes, + TenantId = tenantId, + Type = type + }); + } } diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs index 1f1cc33b..775af9e6 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs @@ -3,8 +3,8 @@ using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Device.Entities; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; -using Kurisu.AspNetCore.Utils; using Kurisu.AspNetCore.Utils.Extensions; using Mapster; using SqlSugar; diff --git a/Src/Dlhis.Basic/Program.cs b/Src/Dlhis.Basic/Program.cs index 882db25c..62899522 100644 --- a/Src/Dlhis.Basic/Program.cs +++ b/Src/Dlhis.Basic/Program.cs @@ -1,5 +1,5 @@ +using Kurisu.AspNetCore.Cache.Extensions; using Kurisu.AspNetCore.Startup; -using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.IdentityModel.Logging; class Program diff --git a/Src/Dlhis.Basic/RecursionHelper.cs b/Src/Dlhis.Basic/RecursionHelper.cs index 9a953c94..cdee2661 100644 --- a/Src/Dlhis.Basic/RecursionHelper.cs +++ b/Src/Dlhis.Basic/RecursionHelper.cs @@ -106,4 +106,25 @@ public static class RecursionHelper } } } + + public static List HandlerDeviceGroupPreviousCodes(Guid current, List data) + { + var result = new List { current }; + + InternalHandlerCodes(current, data, result); + + return result; + + static void InternalHandlerCodes(Guid internalCurrent, List internalData, List internalResult) + { + var pno = internalData.FirstOrDefault(x => x.Code == internalCurrent)?.PCode; + if (!pno.HasValue) + { + return; + } + + internalResult.Add(pno.Value); + InternalHandlerCodes(pno.Value, internalData, internalResult); + } + } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index 5a45ff2a..01da552b 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -12,6 +12,7 @@ using Dlhis.Entity.Device.Enums; using Dlhis.Sys.Api; using Kurisu.AspNetCore; using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index 9bb02d33..caf30660 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -15,6 +15,7 @@ using Dlhis.Canteen.Order.Request; using Dlhis.Entity.Device; using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; diff --git a/Src/Dlhis.Canteen/Program.cs b/Src/Dlhis.Canteen/Program.cs index 8f18c30e..5f74bf3a 100644 --- a/Src/Dlhis.Canteen/Program.cs +++ b/Src/Dlhis.Canteen/Program.cs @@ -1,3 +1,4 @@ +using Kurisu.AspNetCore.Cache.Extensions; using Kurisu.AspNetCore.Startup; using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.IdentityModel.Logging; diff --git a/Src/Dlhis.Entity/Dlhis.Entity.csproj b/Src/Dlhis.Entity/Dlhis.Entity.csproj index a8fefb58..c3f003b9 100644 --- a/Src/Dlhis.Entity/Dlhis.Entity.csproj +++ b/Src/Dlhis.Entity/Dlhis.Entity.csproj @@ -6,12 +6,12 @@ disable - - - - + + + + diff --git a/Src/Dlhis.Entity/SqlSugarPack.cs b/Src/Dlhis.Entity/SqlSugarPack.cs index 77ba0c10..82741972 100644 --- a/Src/Dlhis.Entity/SqlSugarPack.cs +++ b/Src/Dlhis.Entity/SqlSugarPack.cs @@ -15,7 +15,7 @@ public class SqlSugarPack : BaseAppPack { public override void ConfigureServices(IServiceCollection services) { - services.AddSqlSugar(sp => + services.AddSqlSugar(DbType.MySqlConnector, sp => { var configuration = sp.GetService(); @@ -80,7 +80,7 @@ public class SqlSugarPack : BaseAppPack }; }); } - + public override void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var isGenerate = Configuration.GetSection("SqlSugarOptions").GetValue("Generate"); diff --git a/Src/Dlhis.External/Appointment/Services/Implements/AppointmentService.cs b/Src/Dlhis.External/Appointment/Services/Implements/AppointmentService.cs index 334aa43a..4ecd1ff0 100644 --- a/Src/Dlhis.External/Appointment/Services/Implements/AppointmentService.cs +++ b/Src/Dlhis.External/Appointment/Services/Implements/AppointmentService.cs @@ -3,9 +3,9 @@ using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Visitor.Entity; using Dlhis.Entity.Visitor.Enums; using Dlhis.External.Appointment.Request; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; -using Kurisu.AspNetCore.Utils; using Kurisu.AspNetCore.Utils.Extensions; using SqlSugar; diff --git a/Src/Dlhis.External/Program.cs b/Src/Dlhis.External/Program.cs index c388c2a4..04c36cc8 100644 --- a/Src/Dlhis.External/Program.cs +++ b/Src/Dlhis.External/Program.cs @@ -1,6 +1,5 @@ -using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; +using Kurisu.AspNetCore.Cache.Extensions; using Kurisu.AspNetCore.Startup; -using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.IdentityModel.Logging; class Program diff --git a/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs b/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs index 1feee1d4..8ea82c4f 100644 --- a/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs +++ b/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs @@ -51,7 +51,7 @@ public class HealthCheckService : IHealthCheckService } await Task.Delay(_attempted * 1000); - + if (_isOffline == false) { _logger.LogInformation("Health"); @@ -66,11 +66,11 @@ public class HealthCheckService : IHealthCheckService } catch (Exception ex) { - _logger.LogError("Failed cause :{reason}", ex.Message); + _logger.LogError(ex, "Failed cause :{reason}", ex.Message); _isOffline = true; await Task.Delay(5000); } - + return false; } } \ No newline at end of file diff --git a/Src/Dlhis.Middle/Services/Implements/OrderService.cs b/Src/Dlhis.Middle/Services/Implements/OrderService.cs index fadb172f..2928e0e8 100644 --- a/Src/Dlhis.Middle/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Middle/Services/Implements/OrderService.cs @@ -69,7 +69,7 @@ public class OrderService : IOrderService var message = "离线消费:"; - gainfo.ThrowIfNull("无消费权限"); + gainfo.ThrowIfNull(message + "无消费权限"); var isError = false; try diff --git a/Src/Dlhis.ScheduledTask/BaseJob.cs b/Src/Dlhis.ScheduledTask/BaseJob.cs index 845ce16d..6fdd5974 100644 --- a/Src/Dlhis.ScheduledTask/BaseJob.cs +++ b/Src/Dlhis.ScheduledTask/BaseJob.cs @@ -1,8 +1,8 @@ using System.Reflection; using Dlhis.ScheduledTask.Attributes; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; -using Kurisu.AspNetCore.Utils; using Kurisu.Scheduled.Abstractions; namespace Dlhis.ScheduledTask; diff --git a/Src/Dlhis.ScheduledTask/Program.cs b/Src/Dlhis.ScheduledTask/Program.cs index 7c759046..1958c236 100644 --- a/Src/Dlhis.ScheduledTask/Program.cs +++ b/Src/Dlhis.ScheduledTask/Program.cs @@ -1,7 +1,5 @@ -using Dlhis.Jip.Api; -using Dlhis.Jip.Api.Request; +using Kurisu.AspNetCore.Cache.Extensions; using Kurisu.AspNetCore.Startup; -using Kurisu.AspNetCore.Utils.Extensions; class Program { diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs index 9999cfff..e1c3a8ec 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs @@ -3,7 +3,7 @@ using Dlhis.Jip.Api; using Dlhis.Jip.Api.Request; using Dlhis.Jip.Api.Requests; using Hangfire; -using Kurisu.AspNetCore.Utils; +using Kurisu.AspNetCore.Cache; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; diff --git a/Src/Dlhis.Sys/Identity/Services/Implements/RoleService.cs b/Src/Dlhis.Sys/Identity/Services/Implements/RoleService.cs index 6f52900c..efef85c0 100644 --- a/Src/Dlhis.Sys/Identity/Services/Implements/RoleService.cs +++ b/Src/Dlhis.Sys/Identity/Services/Implements/RoleService.cs @@ -2,11 +2,11 @@ using Dlhis.Sys.Identity.Request; using Dlhis.Sys.Identity.Response; using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; -using Kurisu.AspNetCore.Utils; using Kurisu.AspNetCore.Utils.Extensions; namespace Dlhis.Sys.Identity.Services.Implements; diff --git a/Src/Dlhis.Sys/Program.cs b/Src/Dlhis.Sys/Program.cs index e883ec6b..1f7ee7da 100644 --- a/Src/Dlhis.Sys/Program.cs +++ b/Src/Dlhis.Sys/Program.cs @@ -1,5 +1,5 @@ +using Kurisu.AspNetCore.Cache.Extensions; using Kurisu.AspNetCore.Startup; -using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.IdentityModel.Logging; namespace Dlhis.Sys; From e492e3382c157c37fb73a330d3151b438e0937bd Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 10 Dec 2024 17:33:56 +0800 Subject: [PATCH 03/22] =?UTF-8?q?fix=20tenant=E5=88=86=E9=85=8D=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=A4=96=E9=83=A8=E4=BA=BA=E5=91=98=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PermissionAnalyze/TenantPermissionAnalyzeService.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs index d26b9673..14d0df7d 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/TenantPermissionAnalyzeService.cs @@ -1,4 +1,5 @@ using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Basic.Enums; namespace Dlhis.Basic.Device.Services.Implements.PermissionAnalyze; @@ -13,6 +14,8 @@ public class TenantPermissionAnalyzeService : BasePermissionAnalyzeService /// protected override async Task> GetGainfoNosAsync(string assignValue) { - return await DbContext.Queryable().Where(x => x.Factory == assignValue).Select(x => x.No).ToListAsync(); + return await DbContext.Queryable() + .Where(x => x.Factory == assignValue && x.Type != GainfoUserTypeEnumType.External) + .Select(x => x.No).ToListAsync(); } } \ No newline at end of file From b9c853c96f86f779ad280074086929f33563c162 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 10 Dec 2024 17:45:29 +0800 Subject: [PATCH 04/22] =?UTF-8?q?fix=20=E8=BF=94=E5=9B=9E=E5=85=B7?= =?UTF-8?q?=E4=BD=93=E6=96=B0=E5=A2=9E=E5=92=8C=E5=88=A0=E9=99=A4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DeviceGroupsController.cs | 4 ++-- .../Device/Services/IDeviceGroupService.cs | 2 +- .../Services/Implements/DeviceGroupService.cs | 18 +++++++++++------- .../GroupPermissionAnalyzeService.cs | 5 ++++- .../Controllers/GainfoGroupsController.cs | 5 +++-- .../Services/IGainfoGroupService.cs | 5 +++-- .../Services/Implements/GainfoGroupService.cs | 15 +++++++++++---- 7 files changed, 35 insertions(+), 19 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs index bf1a96c5..6a567eb3 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs @@ -70,9 +70,9 @@ public class DeviceGroupsController : ControllerBase [HttpPost("assign")] [Transactional] [CrossTenant] - public async Task AssignDevicesAsync(DeviceAssignRequest request) + public async Task AssignDevicesAsync(DeviceAssignRequest request) { - await _deviceGroupService.AssignDevicesAsync(request); + return await _deviceGroupService.AssignDevicesAsync(request); } /// diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs index 5f0a4368..5a2f0a5b 100644 --- a/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs @@ -12,7 +12,7 @@ public interface IDeviceGroupService : IScopeDependency Task> GetDevicesByGroupCodeAsync(Guid code); - Task AssignDevicesAsync(DeviceAssignRequest requests); + Task AssignDevicesAsync(DeviceAssignRequest requests); Task> GetAppointmentGroupsAsync(); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index 383fdb60..ec2f47d8 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -97,7 +97,7 @@ public class DeviceGroupService : IDeviceGroupService } - public async Task AssignDevicesAsync(DeviceAssignRequest request) + public async Task AssignDevicesAsync(DeviceAssignRequest request) { var group = await _dbContext.Queryable().Where(x => x.Code == request.GroupCode).SingleAsync(); group.ThrowIfNull("设备分组不存在,无法进行分配"); @@ -118,10 +118,10 @@ public class DeviceGroupService : IDeviceGroupService await _dbContext.InsertAsync(entities); - await PermissionResetAsync(request.GroupCode); + return await PermissionResetAsync(request.GroupCode); } - private async Task PermissionResetAsync(Guid groupCode) + private async Task PermissionResetAsync(Guid groupCode) { var deviceGroups = RecursionHelper.HandlerDeviceGroupPreviousCodes(groupCode, await _dbContext.Queryable().ToListAsync()); @@ -130,6 +130,8 @@ public class DeviceGroupService : IDeviceGroupService .Where(x => deviceGroups.Contains(x.UniqueValue)) .ToListAsync(); + var result = new List(); + if (dps.Any()) { var type = dps.First().Type; @@ -143,7 +145,7 @@ public class DeviceGroupService : IDeviceGroupService var codes = devicePermissionGroup.Select(x => x.UniqueValue).Distinct().ToList(); - await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest + var r = await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest { AssignType = assignType, AssignValue = assignValue, @@ -152,10 +154,12 @@ public class DeviceGroupService : IDeviceGroupService TenantId = tenantId, Type = type }); - } + + result.Add(r); + } } - - + + return new DevicePermissionAssignResponse(result.Sum(x => x.AddCount), result.Sum(x => x.DeleteCount)); } public async Task> GetDevicesByGroupCodeAsync(Guid code) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs index d68de6f8..4cb72cf9 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs @@ -18,10 +18,13 @@ public class GroupPermissionAnalyzeService : BasePermissionAnalyzeService var gainfoGroups = await DbContext.Queryable().ToListAsync(); var gainfoGroupCodes = RecursionHelper.HandlerGainfoGroupNextCodes(code, gainfoGroups); - return await DbContext.Queryable() + var gainfoUserNos = await DbContext.Queryable() .Where(x => gainfoGroupCodes.Contains(x.GroupCode)) .Select(x => x.UserNo) .Distinct() .ToListAsync(); + + + return await DbContext.Queryable().Where(x => gainfoUserNos.Contains(x.No)).Select(x => x.No).ToListAsync(); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs index 1df53980..3134714c 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs @@ -1,4 +1,5 @@ using Dlhis.Basic.Device.Filters; +using Dlhis.Basic.Device.Response; using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Basic.Organization.Services; @@ -76,8 +77,8 @@ public class GainfoGroupsController : ControllerBase [AssignPermissionLimit] [Transactional] [CrossTenant] - public async Task AssignGainfosAsync(GainfoAssignRequest request) + public async Task AssignGainfosAsync(GainfoAssignRequest request) { - await _gainfoGroupService.AssignGainfosAsync(request); + return await _gainfoGroupService.AssignGainfosAsync(request); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs index 258089ec..37f49505 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs @@ -1,4 +1,5 @@ -using Dlhis.Basic.Organization.Request; +using Dlhis.Basic.Device.Response; +using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; namespace Dlhis.Basic.Organization.Services; @@ -11,7 +12,7 @@ public interface IGainfoGroupService : IScopeDependency Task> GetGainfosByGroupAsync(Guid code); - Task AssignGainfosAsync(GainfoAssignRequest request); + Task AssignGainfosAsync(GainfoAssignRequest request); Task> GetGainfoGroupsByUserCodeAsync(string userCode); } diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index dd195f8b..2f3e7465 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -1,5 +1,6 @@ using Dlhis.Basic.Device; using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Response; using Dlhis.Basic.Device.Services; using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; @@ -75,7 +76,7 @@ public class GainfoGroupService : IGainfoGroupService return list; } - public async Task AssignGainfosAsync(GainfoAssignRequest request) + public async Task AssignGainfosAsync(GainfoAssignRequest request) { if (request.UserNos.IsPresent()) { @@ -106,11 +107,11 @@ public class GainfoGroupService : IGainfoGroupService await _dbContext.InsertAsync(entities); - await PermissionResetAsync(request.GroupCode); + return await PermissionResetAsync(request.GroupCode); } - private async Task PermissionResetAsync(Guid groupCode) + private async Task PermissionResetAsync(Guid groupCode) { var gainfoGroups = RecursionHelper.HandlerGainfoGroupPreviousCodes(groupCode, await _dbContext.Queryable().ToListAsync()).Select(x => x.ToString()); @@ -121,6 +122,8 @@ public class GainfoGroupService : IGainfoGroupService var analyzeService = _namedResolver.GetService(PermissionAnalyzeConstants.GetTypeName(AssignTypeEnumType.Group)); + var result = new List(); + foreach (var devicePermissionGroup in dps.GroupBy(x => new { x.AssignValue, x.TenantId, x.UniqueType, x.Type })) { var assignValue = devicePermissionGroup.Key.AssignValue; @@ -130,7 +133,7 @@ public class GainfoGroupService : IGainfoGroupService var codes = devicePermissionGroup.Select(x => x.UniqueValue).Distinct().ToList(); - await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest + var r = await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest { AssignType = AssignTypeEnumType.Group, AssignValue = assignValue, @@ -139,7 +142,11 @@ public class GainfoGroupService : IGainfoGroupService TenantId = tenantId, Type = type }); + + result.Add(r); } + + return new DevicePermissionAssignResponse(result.Sum(x => x.AddCount), result.Sum(x => x.DeleteCount)); } From d44a2c5abb4e8dfa6cc0020cc912e0d2beaf37c8 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 10 Dec 2024 19:04:42 +0800 Subject: [PATCH 05/22] =?UTF-8?q?fix=20=E6=9D=83=E9=99=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetDataPermissionService.cs | 61 ++++++++++++------- .../IDevicePermissionAnalyzeService.cs | 3 + .../BasePermissionAnalyzeService.cs | 42 +------------ .../Services/Implements/DeviceGroupService.cs | 13 ++-- .../DevicePermissionAnalyzeService.cs | 23 ++++++- .../Services/Implements/GainfoGroupService.cs | 31 ++++++++-- 6 files changed, 100 insertions(+), 73 deletions(-) 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(); From 427a38eba46758ed6ac4d6f9df55e97b69a7c95b Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 10 Dec 2024 19:05:47 +0800 Subject: [PATCH 06/22] =?UTF-8?q?fix=20=E8=AE=BE=E5=A4=87=E5=88=86?= =?UTF-8?q?=E7=BB=84=E6=9D=83=E9=99=90=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs index 6a567eb3..e2fb75cd 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs @@ -31,6 +31,7 @@ public class DeviceGroupsController : ControllerBase /// [HttpGet("tree")] [IgnoreTenant] + [DataPermission] public async Task> GetTreeAsync( [EnumDataType(typeof(DeviceTypeEnumType), ErrorMessage = "请选择正确的类型")] DeviceTypeEnumType type From 5843a4a2c81ff58ead337f7c29eeacf686d6de02 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 10 Dec 2024 19:15:28 +0800 Subject: [PATCH 07/22] =?UTF-8?q?fix=20=E6=95=B0=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=88=86=E7=BB=84=E9=97=AE=E9=A2=98=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataPermissions/GetDataPermissionService.cs | 10 +++++----- Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs index f296392e..117ec9fa 100644 --- a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs +++ b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs @@ -69,13 +69,13 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc { deviceCodes = db.Queryable().Where(x => myDeviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList(); } - - if (deviceGroupCodeProperty != null) - { - dict.Add(deviceGroupCodeProperty.Name, deviceGroupCodes); - } } + if (deviceGroupCodeProperty != null) + { + dict.Add(deviceGroupCodeProperty.Name, deviceGroupCodes); + } + if (deviceCodeProperty != null) { var currentDeviceCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device).Select(x => x.UniqueValue).ToList(); diff --git a/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs b/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs index 4b2b916f..babfb4db 100644 --- a/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs +++ b/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs @@ -1,4 +1,5 @@ -using Dlhis.Entity.Device.Enums; +using Dlhis.DataPermission.Model; +using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar; using SqlSugar; @@ -27,6 +28,7 @@ public class DeviceGroupEntity : SugarBaseEntity, ITenantId, ISoftDeleted /// /// 设备组code /// + [DeviceGroupCode] [SugarColumn(ColumnDescription = "设备组code")] public Guid Code { get; set; } From 581a8133449d5f01f57b683b63409e9f3a333d51 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 00:30:25 +0800 Subject: [PATCH 08/22] =?UTF-8?q?fix=20=E9=80=BB=E8=BE=91=E8=B0=83?= =?UTF-8?q?=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 @@ - + From 403098b3e151300041ccfa560927ce8270582e09 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 13:56:19 +0800 Subject: [PATCH 09/22] =?UTF-8?q?fix=20=E7=94=A8=E6=88=B7=E7=BB=84?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E8=A7=A6=E5=8F=91=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Implements/GainfoGroupService.cs | 160 +++++++++++++----- 1 file changed, 113 insertions(+), 47 deletions(-) diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index b9bfc754..a81487da 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -1,11 +1,11 @@ -using Dlhis.Basic.DataPermissions; -using Dlhis.Basic.Device; -using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Dtos; using Dlhis.Basic.Device.Response; using Dlhis.Basic.Device.Services; using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Device.Enums; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; @@ -19,18 +19,15 @@ public class GainfoGroupService : IGainfoGroupService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; - private readonly IMyDataPermissionService _myDataPermissionService; - private readonly INamedResolver _namedResolver; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; public GainfoGroupService(IDbContext dbContext, ICurrentUser currentUser, - IMyDataPermissionService myDataPermissionService, - INamedResolver namedResolver) + IDevicePermissionAnalyzeService devicePermissionAnalyzeService) { _dbContext = dbContext; _currentUser = currentUser; - _myDataPermissionService = myDataPermissionService; - _namedResolver = namedResolver; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; } public async Task> GetTreeAsync() @@ -96,16 +93,19 @@ public class GainfoGroupService : IGainfoGroupService var relations = await _dbContext.Queryable() .Where(x => x.GroupCode == request.GroupCode) .ToListAsync(); - await _dbContext.DeleteAsync(relations); - var userNos = await _dbContext.Queryable() + + var presentUserNos = await _dbContext.Queryable() .Where(x => request.UserNos.Contains(x.No) || request.UserNos.Contains(x.Code)) //NO和工号匹配 .Select(x => x.No) .ToListAsync(); //(userNos.Count != request.UserNos.Count).ThrowIfTrue("存在权限外人员,无法添加"); - var entities = userNos.Select(x => new GainfoGroupRelationshipEntity + var r = await PermissionResetAsync(request.GroupCode, relations.Select(x => x.UserNo).Distinct().ToList(), presentUserNos); + + await _dbContext.DeleteAsync(relations); + var entities = presentUserNos.Select(x => new GainfoGroupRelationshipEntity { GroupCode = request.GroupCode, UserNo = x @@ -113,61 +113,127 @@ public class GainfoGroupService : IGainfoGroupService await _dbContext.InsertAsync(entities); - return await PermissionResetAsync(request.GroupCode); + + return r; } - private async Task PermissionResetAsync(Guid groupCode) + private async Task PermissionResetAsync(Guid groupCode, List beforeUserNos, List presentUserNos) { + var usersToAdd = presentUserNos.Except(beforeUserNos).ToList(); + var usersToDelete = beforeUserNos.Except(presentUserNos).ToList(); + if (usersToAdd.IsEmpty() && usersToDelete.IsEmpty()) + { + return new DevicePermissionAssignResponse(0, 0); + } + 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 => 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(); + //var result = new List(); + var deviceGroups = dps.Any(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + ? await _dbContext.Queryable().ToListAsync() + : new List(0); - dps.AddRange(dps2); - - var analyzeService = _namedResolver.GetService(PermissionAnalyzeConstants.GetTypeName(AssignTypeEnumType.Group)); - - var result = new List(); - - foreach (var devicePermissionGroup in dps.GroupBy(x => new { x.AssignValue, x.TenantId, x.UniqueType, x.Type })) + //只会循环2次 + var deviceCodes = new List(); + foreach (var devicePermissionGroup in dps.GroupBy(x => x.UniqueType)) { - var assignValue = devicePermissionGroup.Key.AssignValue; - var tenantId = devicePermissionGroup.Key.TenantId; - var uniqueType = devicePermissionGroup.Key.UniqueType; - var type = devicePermissionGroup.Key.Type; - var codes = devicePermissionGroup.Select(x => x.UniqueValue).Distinct().ToList(); - var r = await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest + if (devicePermissionGroup.Key == DeviceAssignmentTypeEnumType.Group) { - AssignType = AssignTypeEnumType.Group, - AssignValue = assignValue, - UniqueType = uniqueType, - Codes = codes, - TenantId = tenantId, - Type = type - }); + deviceCodes.AddRange(await GetDeviceCodeByGroupAsync(codes, deviceGroups)); + } - result.Add(r); + deviceCodes.AddRange(codes); } - return new DevicePermissionAssignResponse(result.Sum(x => x.AddCount), result.Sum(x => x.DeleteCount)); + deviceCodes = deviceCodes.Distinct().ToList(); + 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) + : new Dictionary>(); + + var addTasks = new List(); + var deleteTasks = new List(); + foreach (var device in devices) + { + foreach (var item in usersToDelete) + { + var myDeviceCodes = userTenantDeviceCodes[item].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); + if (myDeviceCodes.Any(x => x == device.Code)) + { + continue; + } + + deleteTasks.Add(new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Delete, + DeviceType = device.Type, + UserId = null, + UserNo = item, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 0, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = device.TenantId + }); + } + + foreach (var item in usersToAdd) + { + addTasks.Add(new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Add, + DeviceType = device.Type, + UserId = null, + UserNo = item, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 0, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = device.TenantId + }); + } + } + + await _dbContext.InsertAsync(addTasks); + await _dbContext.InsertAsync(deleteTasks); + + return new DevicePermissionAssignResponse(addTasks.Count, deleteTasks.Count); + } + + /// + /// 获取分组下的deviceCode + /// + /// + /// + /// + private async Task> GetDeviceCodeByGroupAsync(List codes, List deviceGroups) + { + var result = new List(); + codes.ForEach(groupCode => result.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(groupCode, deviceGroups))); + + result = result.Distinct().ToList(); + + return await _dbContext.Queryable() + .Where(x => result.Contains(x.GroupCode)) + .Select(x => x.DeviceCode) + .Distinct() + .ToListAsync(); } From 4e47986e25017c2ec4eafde1b71769511bf21ff2 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 14:11:50 +0800 Subject: [PATCH 10/22] =?UTF-8?q?fix=20analyze=E6=95=B0=E6=8D=AE=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Implements/BasePermissionAnalyzeService.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index d90d7e64..d4c72dd7 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -55,16 +55,18 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.GetActualAssignValue(), request.AssignType) : new Dictionary>(); - var tasks = new List(); + var tasksToAdd = new List(); + var tasksToDelete = new List(); foreach (var gainfoNo in gainfoNos) { + IEnumerable currentDevicesToDelete = devicesToDelete; 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(); + currentDevicesToDelete = devicesToDelete.Where(p => codesToDelete.Except(myDeviceCodes).Contains(p.Code)); } - tasks.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity + tasksToAdd.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity { Type = DeviceTaskEnumType.Add, DeviceType = x.Type, @@ -80,7 +82,7 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService TenantId = x.TenantId, }).ToList()); - tasks.AddRange(devicesToDelete.Select(x => new DeviceTaskEntity + tasksToDelete.AddRange(currentDevicesToDelete.Select(x => new DeviceTaskEntity { Type = DeviceTaskEnumType.Delete, DeviceType = x.Type, @@ -97,10 +99,11 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService }).ToList()); } - await ChunkInsertAsync(tasks); + await ChunkInsertAsync(tasksToAdd); + await ChunkInsertAsync(tasksToDelete); await PersistDataAsync(dps, request); - return new DevicePermissionAssignResponse(devicesToAdd.Count, devicesToDelete.Count); + return new DevicePermissionAssignResponse(tasksToAdd.Count, tasksToDelete.Count); } From c1a029399318453bcaa40921651eb93b9fa2e077 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 15:54:02 +0800 Subject: [PATCH 11/22] =?UTF-8?q?fix=20=E8=AE=BE=E5=A4=87=E7=BB=84?= =?UTF-8?q?=E5=B7=AE=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 From cbf9a496a93ec22643381848471a07240dbc231b Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 16:05:52 +0800 Subject: [PATCH 12/22] =?UTF-8?q?fix=20=E5=BC=95=E7=94=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Device/Dtos/TenantAssignTypeDeviceCode.cs | 6 +++--- .../Implements/DevicePermissionAnalyzeService.cs | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs index 6e6632dc..7079febe 100644 --- a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs +++ b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs @@ -15,7 +15,7 @@ public class TenantAssignTypeDeviceCode /// /// 设备权限 /// - public IEnumerable AssignTypes { get; init; } + public List AssignTypes { get; init; } } public class AssignTypeDeviceCode @@ -35,10 +35,10 @@ public class AssignTypeDeviceCode /// /// 权限 /// - public IEnumerable Codes { get; set; } + public List Codes { get; set; } - public IEnumerable OriginalCodes { get; set; } + public List OriginalCodes { get; set; } } public class UserTenantDeviceCodeDto diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index 138bf32d..57caf78e 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -248,9 +248,9 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService 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) - }) + Codes = p.SelectMany(xx => xx.Codes).ToList(), + OriginalCodes = p.Where(xx => xx.OriginalCodes.IsPresent()).SelectMany(xx => xx.OriginalCodes).ToList() + }).ToList() }; return dto; @@ -299,8 +299,8 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService AssignType = xx.Key.AssignType, AssignValue = xx.Key.AssignValue, UniqueType = uniqueType, - Codes = xx.Select(xxx => xxx.UniqueValue) - }) + Codes = xx.Select(xxx => xxx.UniqueValue).ToList() + }).ToList() }) .ToList(); @@ -318,7 +318,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService nextItems = nextItems.Distinct().ToList(); assignTypeDeviceCodeItem.OriginalCodes = nextItems; - assignTypeDeviceCodeItem.Codes = deviceGroupRelationships.Where(x => nextItems.Contains(x.GroupCode)).Select(x => x.DeviceCode); + assignTypeDeviceCodeItem.Codes = deviceGroupRelationships.Where(x => nextItems.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList(); } } } From 7f71de803ac4621978f5f7a902ee5da3d77e3b05 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 16:12:33 +0800 Subject: [PATCH 13/22] =?UTF-8?q?fix=20=E6=97=A0=E5=B7=AE=E5=BC=82?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8C=81=E4=B9=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasePermissionAnalyzeService.cs | 120 ++++++++++-------- 1 file changed, 64 insertions(+), 56 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index 1f4df7ee..e05dded8 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -35,74 +35,82 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService public async Task AnalyzeAsync(DevicePermissionSaveRequest request) { + var tasksToAdd = new List(); + var tasksToDelete = new List(); + await CheckWhetherAssignToTopDeviceGroupAsync(request); await CheckAssignedToTenantAsync(request); var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request); - (List codesToAdd, List codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes); - if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty()) + try { - return new DevicePermissionAssignResponse(0, 0); - } - - var devicesToAdd = await DbContext.Queryable().Where(x => codesToAdd.Contains(x.Code)).Distinct().ToListAsync(); - var devicesToDelete = await DbContext.Queryable().Where(x => codesToDelete.Contains(x.Code)).Distinct().ToListAsync(); - - var gainfoNos = await GetGainfoNosAsync(request.GetActualAssignValue()); - - var userTenantDeviceCodes = devicesToDelete.IsPresent() && request.AssignType != AssignTypeEnumType.Tenant - ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.UniqueType, request.GetActualAssignValue(), request.AssignType) - : new Dictionary>(); - - var tasksToAdd = new List(); - var tasksToDelete = new List(); - foreach (var gainfoNo in gainfoNos) - { - IEnumerable currentDevicesToDelete = devicesToDelete; - if (userTenantDeviceCodes.Any()) + (List codesToAdd, List codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes); + if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty()) { - var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); - var actToDeleteCodes = codesToDelete.Except(myDeviceCodes); - currentDevicesToDelete = devicesToDelete.Where(p => actToDeleteCodes.Contains(p.Code)); + return new DevicePermissionAssignResponse(0, 0); } - tasksToAdd.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()); + var devicesToAdd = await DbContext.Queryable().Where(x => codesToAdd.Contains(x.Code)).Distinct().ToListAsync(); + var devicesToDelete = await DbContext.Queryable().Where(x => codesToDelete.Contains(x.Code)).Distinct().ToListAsync(); - tasksToDelete.AddRange(currentDevicesToDelete.Select(x => new DeviceTaskEntity + var gainfoNos = await GetGainfoNosAsync(request.GetActualAssignValue()); + + var userTenantDeviceCodes = devicesToDelete.IsPresent() && request.AssignType != AssignTypeEnumType.Tenant + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.UniqueType, request.GetActualAssignValue(), request.AssignType) + : new Dictionary>(); + + + foreach (var gainfoNo in gainfoNos) { - 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()); + IEnumerable currentDevicesToDelete = devicesToDelete; + if (userTenantDeviceCodes.Any()) + { + var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); + var actToDeleteCodes = codesToDelete.Except(myDeviceCodes); + currentDevicesToDelete = devicesToDelete.Where(p => actToDeleteCodes.Contains(p.Code)); + } + + tasksToAdd.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()); + + tasksToDelete.AddRange(currentDevicesToDelete.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 ChunkInsertAsync(tasksToAdd); + await ChunkInsertAsync(tasksToDelete); + } + finally + { + await PersistDataAsync(dps, request); } - - await ChunkInsertAsync(tasksToAdd); - await ChunkInsertAsync(tasksToDelete); - await PersistDataAsync(dps, request); return new DevicePermissionAssignResponse(tasksToAdd.Count, tasksToDelete.Count); } From fcbb7b4fc24a88e7c41809a266fb5cd4956e3d9f Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 17:17:08 +0800 Subject: [PATCH 14/22] =?UTF-8?q?fix=20=E8=AE=BE=E5=A4=87=E7=BB=84?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=AE=BE=E5=A4=87=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Device/Dtos/TenantAssignTypeDeviceCode.cs | 2 +- .../Services/Implements/DeviceGroupService.cs | 77 ++++++++++--------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs index 7079febe..9e511afc 100644 --- a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs +++ b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs @@ -15,7 +15,7 @@ public class TenantAssignTypeDeviceCode /// /// 设备权限 /// - public List AssignTypes { get; init; } + public List AssignTypes { get; set; } } public class AssignTypeDeviceCode diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index bdb23519..5f3695a4 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -158,29 +158,11 @@ public class DeviceGroupService : IDeviceGroupService 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(); + var tasksToAdd = new List(); + var tasksToDelete = 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 + tasksToAdd.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity { Type = DeviceTaskEnumType.Add, DeviceType = x.Type, @@ -196,26 +178,47 @@ public class DeviceGroupService : IDeviceGroupService TenantId = x.TenantId, }).ToList()); - tasks.AddRange(devicesToDelete.Select(x => new DeviceTaskEntity + if (userTenantDeviceCodes.Any()) { - 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()); + var permissions = userTenantDeviceCodes[gainfoNo].ToList(); + foreach (var permission in permissions) + { + permission.AssignTypes = permission.AssignTypes.Where(p => + { + if (p.UniqueType == DeviceAssignmentTypeEnumType.Device) + { + return true; + } + + return p.OriginalCodes.IsPresent() && p.OriginalCodes.First() != groupCode; + }).ToList(); + } + + var myDeviceCodes = permissions.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).ToList(); + var currentDevicesToDelete = devicesToDelete.Where(p => devicesToDelete.Select(x => x.Code).Except(myDeviceCodes).Contains(p.Code)).ToList(); + + tasksToDelete.AddRange(currentDevicesToDelete.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); + await _dbContext.InsertAsync(tasksToAdd); + await _dbContext.InsertAsync(tasksToDelete); - return new DevicePermissionAssignResponse(gainfoNos.Count * devicesToAdd.Count, gainfoNos.Count * devicesToDelete.Count); + return new DevicePermissionAssignResponse(tasksToAdd.Count, tasksToDelete.Count); } /// From b070d0ea58ea9251f8ddd8eae5ab79f2dd181670 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 17:42:49 +0800 Subject: [PATCH 15/22] =?UTF-8?q?fix=20=E4=BC=98=E5=8C=96=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=95=B0=E6=8D=AE=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionAnalyzeService.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index 57caf78e..c97f9049 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -35,8 +35,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService public async Task> GetDevicePermissions(DevicePermissionSaveRequest request) { - var currentTenantId = _currentUser.GetStringTenantId(); - + var currentTenantId = await GetCurrentFactoryAsync(request); (bool enableDeviceFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); (bool enableDeviceGroupFilter, List deviceGroupCodes) = _myDataPermissionService.GetMyDeviceGroupCodes(); @@ -50,6 +49,22 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService .ToListAsync(); } + private async Task GetCurrentFactoryAsync(DevicePermissionSaveRequest request) + { + var currentTenantId = _currentUser.GetStringTenantId(); + + var r = request.UniqueType switch + { + DeviceAssignmentTypeEnumType.Device => await _dbContext.Queryable().Where(x => request.Codes.Contains(x.Code)).Where(x => x.TenantId != currentTenantId).AnyAsync(), + DeviceAssignmentTypeEnumType.Group => await _dbContext.Queryable().Where(x => request.Codes.Contains(x.Code)).Where(x => x.TenantId != currentTenantId).AnyAsync(), + _ => false + }; + + r.ThrowIfTrue("存在设备或者设备组不属于当前厂区,操作失败!"); + + return currentTenantId; + } + public async Task GenerateDeviceTasksAsync(Func func, List userNos) { From 6684f0792526d6e20f92df0d008dddcb180a2ede Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 18:11:37 +0800 Subject: [PATCH 16/22] =?UTF-8?q?fix=20=E7=94=A8=E6=88=B7=E7=BB=84?= =?UTF-8?q?=E5=88=86=E9=85=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Implements/GainfoGroupService.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index 99df36c5..49609e4b 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(), null, groupCode.ToString(), AssignTypeEnumType.Group) + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(beforeUserNos.Union(presentUserNos).ToList()) : new Dictionary>(); var addTasks = new List(); @@ -167,7 +167,13 @@ public class GainfoGroupService : IGainfoGroupService { foreach (var item in usersToDelete) { - var myDeviceCodes = userTenantDeviceCodes[item].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); + var permissions = userTenantDeviceCodes[item].ToList(); + foreach (var permission in permissions) + { + permission.AssignTypes = permission.AssignTypes.Where(p => !gainfoGroupCodes.Contains(p.AssignValue)).ToList(); + } + + var myDeviceCodes = permissions.SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); if (myDeviceCodes.Any(x => x == device.Code)) { continue; From 3a6aa8ea0f92d18ff05cd708f50f68355705c1ad Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 12 Dec 2024 11:54:18 +0800 Subject: [PATCH 17/22] =?UTF-8?q?fix=20=E7=AE=80=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionAnalyzeService.cs | 62 +++++++++---------- .../Implements/DevicePermissionService.cs | 33 ---------- Src/Dlhis.Basic/ParallelExtensions.cs | 7 +++ 3 files changed, 36 insertions(+), 66 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index c97f9049..27d135c6 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -187,7 +187,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService var analyzePack = new AnalyzePackDto { UserNo = gainfo.No, - UserDepartment = gainfo.Factory + ":" + gainfo.DepartmentNo, + UserDepartment = gainfo.DepartmentNo, 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), //外包人员不允许餐饮 @@ -228,26 +228,43 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService continue; } + if (assignType == AssignTypeEnumType.Group) + { + var tempUserGroupCodes = analyzePack.UserGainfoGroupCodes.ToList(); + foreach (Guid analyzePackUserGainfoGroupCode in analyzePack.UserGainfoGroupCodes) + { + tempUserGroupCodes.AddRange(RecursionHelper.HandlerGainfoGroupPreviousCodes(analyzePackUserGainfoGroupCode, gainfoGroups)); + } + + analyzePack.UserGainfoGroupCodes = tempUserGroupCodes.Distinct().ToList(); + } + var assignValues = assignType switch { - AssignTypeEnumType.User => new[] { analyzePack.UserNo }, - AssignTypeEnumType.Group => analyzePack.UserGainfoGroupCodes.Select(x => x.ToString()).ToArray(), - AssignTypeEnumType.Department => new[] { analyzePack.UserDepartment }, - AssignTypeEnumType.Tenant => new[] { analyzePack.UserFactory }, + AssignTypeEnumType.User => new List { analyzePack.UserNo }, + AssignTypeEnumType.Group => analyzePack.UserGainfoGroupCodes.Select(x => x.ToString()), + AssignTypeEnumType.Department => RecursionHelper.HandlerDepartmentPreviousCodes(analyzePack.UserDepartment, departments).Select(x => analyzePack.UserFactory + ":" + x).ToList(), + AssignTypeEnumType.Tenant => new List { analyzePack.UserFactory }, AssignTypeEnumType.Role => throw new ArgumentOutOfRangeException(), _ => throw new ArgumentOutOfRangeException() }; - 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) + foreach (var dataPack in data.GroupBy(x => x.uniqueType)) { - deviceDtos.AddRange(GetCurrentAssignTypePermissions(devicePermissions, gainfoGroups, departments, - deviceGroups, deviceGroupRelationships, - item.uniqueType, assignType, item.assignValue)); + var currentUniqueType = dataPack.Key; + var currentAssignValues = dataPack.Select(x => x.assignValue).ToList(); + + deviceDtos.AddRange( + SearchActualAssignPermissions( + devicePermissions, + deviceGroups, deviceGroupRelationships, + currentUniqueType, assignType, currentAssignValues + ) + ); } } @@ -272,35 +289,14 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService }); } - private static List GetCurrentAssignTypePermissions( + private static List SearchActualAssignPermissions( List devicePermissions, - List gainfoGroups, - List departments, List deviceGroups, List deviceGroupRelationships, DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, - string assignValue) + List assignValues) { - var assignValues = new List { assignValue }; - - if (assignType == AssignTypeEnumType.Department) - { - // 2401:00001 - //递归向上获取 assignValue = department.No - var arr = assignValue.Split(":"); - var tenantId = arr[0]; - var currentDepartmentNo = arr[1]; - - assignValues = RecursionHelper.HandlerDepartmentPreviousCodes(currentDepartmentNo, departments).Select(x => tenantId + ":" + x).ToList(); - } - - if (assignType == AssignTypeEnumType.Group) - { - assignValues = RecursionHelper.HandlerGainfoGroupPreviousCodes(Guid.Parse(assignValue), gainfoGroups).Select(x => x.ToString()).ToList(); - } - - var r = devicePermissions .Where(x => x.UniqueType == uniqueType) .Where(x => x.AssignType == assignType) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index fa057727..e6288e04 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -127,39 +127,6 @@ public class DevicePermissionService : IDevicePermissionService Priority = 0, TenantId = currentTenantId }).ToList()); - - // await GenerateDeviceTasksAsync(async () => - // { - // await _dbContext.DeleteAsync(p); - // - // //保存配置的权限 - // if (request.Values.IsPresent()) - // { - // var nos = await _dbContext.Client.Queryable() - // .Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable() - // .Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today)) - // .Any() - // ) - // .Where(gainfo => request.Values.Contains(gainfo.Code) || request.Values.Contains(gainfo.No) || request.Values.Contains(gainfo.IdNo)) - // .Select(gainfo => gainfo.No) - // .ToListAsync(); - // - // //todo 临时注释 - // //(gainfoNos.Count != request.Values.Count).ThrowIfTrue("存在非当前权限访问的人员,操作禁止!"); - // - // var devicePermissions = nos.Select(v => new DevicePermissionEntity - // { - // UniqueType = request.UniqueType, - // UniqueValue = request.UniqueValue, - // AssignType = request.AssignType, - // AssignValue = v, - // TenantId = currentTenantId, - // Type = request.Type - // }).ToList(); - // - // await _dbContext.InsertAsync(devicePermissions); - // } - // }, gainfoNos); } /// diff --git a/Src/Dlhis.Basic/ParallelExtensions.cs b/Src/Dlhis.Basic/ParallelExtensions.cs index d8bf78d7..f330fa41 100644 --- a/Src/Dlhis.Basic/ParallelExtensions.cs +++ b/Src/Dlhis.Basic/ParallelExtensions.cs @@ -4,6 +4,13 @@ public static class ParallelExtensions { public static void ParallelForEach(this IEnumerable source, Action action) { +#if DEBUG + foreach (var item in source) + { + action.Invoke(item); + } +#else Parallel.ForEach(source, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, action); +#endif } } \ No newline at end of file From 37ca88c6f9d1bfec946b0ca7db37ca94086a7af4 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 12 Dec 2024 16:30:43 +0800 Subject: [PATCH 18/22] =?UTF-8?q?fix=20=E6=9F=A5=E8=AF=A2=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionsController.cs | 2 +- .../Device/Dtos/DevicePermissionSourceDto.cs | 27 ++++ .../Device/Dtos/TenantAssignTypeDeviceCode.cs | 1 - .../DevicePermissionsAssignToDeviceRequest.cs | 35 +---- .../IDevicePermissionAnalyzeService.cs | 20 ++- .../Services/IDevicePermissionService.cs | 2 +- .../BasePermissionAnalyzeService.cs | 2 +- .../Services/Implements/DeviceGroupService.cs | 18 +++ .../DevicePermissionAnalyzeService.cs | 27 ++-- .../Implements/DevicePermissionService.cs | 135 +++++++++++------- .../GainfoPermissionsController.cs | 2 +- .../GainfoDevicePermissionResponse.cs | 69 +++++++++ .../Services/IGainfoPermissionService.cs | 2 +- .../Services/Implements/GainfoGroupService.cs | 3 +- .../Implements/GainfoPermissionService.cs | 45 +++--- 15 files changed, 258 insertions(+), 132 deletions(-) create mode 100644 Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs create mode 100644 Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index 0e26e4f6..1770f26f 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -39,7 +39,7 @@ public class DevicePermissionsController : ControllerBase } /// - /// 分配权限到设备/设备组/营业点 + /// 分配权限到设备 /// /// [HttpPost("assign-unique")] diff --git a/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs new file mode 100644 index 00000000..518cf49d --- /dev/null +++ b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs @@ -0,0 +1,27 @@ +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Basic.Device.Dtos; + +public class DevicePermissionSourceDto +{ + public string Factory { get; set; } + + public IEnumerable Types { get; set; } +} + +public class DevicePermissionSourceTypeDto +{ + /// + /// 分配类型 + /// + public AssignTypeEnumType AssignType { get; init; } + + /// + /// 分配值 + /// + public string AssignValue { get; init; } + + public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + public IEnumerable Codes { 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 9e511afc..8876e200 100644 --- a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs +++ b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs @@ -37,7 +37,6 @@ public class AssignTypeDeviceCode /// public List Codes { get; set; } - public List OriginalCodes { get; set; } } diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs index aca6ea05..fec467ac 100644 --- a/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs @@ -1,45 +1,14 @@ -using System.ComponentModel.DataAnnotations; -using Dlhis.Entity.Device.Enums; -using Dlhis.Entity.Sys.Enums; +namespace Dlhis.Basic.Device.Request; -namespace Dlhis.Basic.Device.Request; - -public class DevicePermissionsAssignToDeviceRequest : IValidatableObject +public class DevicePermissionsAssignToDeviceRequest { - /// - /// 分配类型 - /// - public DeviceAssignmentTypeEnumType UniqueType { get; set; } - /// /// 分配值 /// public Guid UniqueValue { get; set; } - /// - /// 来源 - /// - public AssignTypeEnumType AssignType { get; set; } - /// /// 来源值 /// public List Values { get; set; } - - - [EnumDataType(typeof(DeviceTypeEnumType))] - public DeviceTypeEnumType Type { get; set; } - - /// - /// 只删除权限 - /// - public bool IsDelete { get; set; } - - public IEnumerable Validate(ValidationContext validationContext) - { - if (AssignType != AssignTypeEnumType.User) - { - yield return new ValidationResult("仅支持导入档案人员", new[] { nameof(AssignType) }); - } - } } \ 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 b28664d4..77dec70b 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs @@ -12,19 +12,25 @@ namespace Dlhis.Basic.Device.Services; /// public interface IDevicePermissionAnalyzeService : IScopeDependency { - Task> GetDevicePermissions(DevicePermissionSaveRequest request); + Task> GetDevicePermissionsAsync(DevicePermissionSaveRequest request); Task GenerateDeviceTasksAsync(Func func, List userNos); - Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( - List userNos, - DeviceAssignmentTypeEnumType? ignoreUniqueType = null, - string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null - ); - Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request); Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request); Task> GetAssignDeviceCodesAsync(string userCode); + + + Task>> GetUserAssignDeviceCodesInTenantAsync( + List userNos, + DeviceAssignmentTypeEnumType? ignoreUniqueType = null, + string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null); + + Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( + List userNos, + DeviceAssignmentTypeEnumType? ignoreUniqueType = null, + string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null + ); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 17b9d049..b3f56470 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -21,7 +21,7 @@ public interface IDevicePermissionService : IScopeDependency /// /// /// - Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request); + Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request); Task AssignToUniqueImportAsync(IFormFile file); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index e05dded8..a45c8391 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -41,7 +41,7 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService await CheckWhetherAssignToTopDeviceGroupAsync(request); await CheckAssignedToTenantAsync(request); - var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request); + var dps = await _devicePermissionAnalyzeService.GetDevicePermissionsAsync(request); try { diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index 5f3695a4..56f6ed32 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -106,6 +106,7 @@ public class DeviceGroupService : IDeviceGroupService await CheckNoNextGroupAsync(group.Code); await CheckGroupTypeMatchAsync(request, group); + await CheckAssignToTenantAsync(group.Code, request.DeviceCodes); var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); @@ -125,6 +126,23 @@ public class DeviceGroupService : IDeviceGroupService return r; } + private async Task CheckAssignToTenantAsync(Guid groupCode, List deviceCodes) + { + if (await _dbContext.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + .Where(x => x.UniqueValue == groupCode) + .AnyAsync()) + { + (await _dbContext.Queryable() + .Where(x => x.AssignType != AssignTypeEnumType.Tenant) + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device) + .Where(x => deviceCodes.Contains(x.UniqueValue)) + .AnyAsync()).ThrowIfTrue("无法分配设备到该设备组:设备组已分配到厂区"); + } + } + + private async Task PermissionResetAsync(Guid groupCode, List beforeDeviceCodes, List presentDeviceCodes) { var codesToAdd = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index 27d135c6..6756c347 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -33,7 +33,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService } - public async Task> GetDevicePermissions(DevicePermissionSaveRequest request) + public async Task> GetDevicePermissionsAsync(DevicePermissionSaveRequest request) { var currentTenantId = await GetCurrentFactoryAsync(request); (bool enableDeviceFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); @@ -196,7 +196,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService IgnoreUniqueType = ignoreUniqueType }; - var codes = GetAssignDeviceCodesInternal(analyzePack, + var codes = GetAssignDeviceCodesPermissions(analyzePack, gainfoGroups, devicePermissions, deviceGroups, @@ -210,7 +210,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService } - private static IEnumerable GetAssignDeviceCodesInternal( + private static IEnumerable GetAssignDeviceCodesPermissions( AnalyzePackDto analyzePack, List gainfoGroups, List devicePermissions, @@ -366,18 +366,17 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService public async Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request) { - var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; + var r = await GetDevicePermissionsAsync(new DevicePermissionSaveRequest + { + AssignType = request.AssignType, + AssignValue = request.AssignValue, + UniqueType = request.UniqueType, + Codes = null, + TenantId = request.TenantId, + Type = request.Type + }); - (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(enableFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Device, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Select(x => x.UniqueValue) - .ToListAsync(); + return r.Select(x => x.UniqueValue).ToList(); } public async Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index e6288e04..316c2eaf 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -46,29 +46,30 @@ public class DevicePermissionService : IDevicePermissionService .AnalyzeAsync(request); } - public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) + public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) { var currentTenantId = _currentUser.GetStringTenantId(); - var today = DateTime.Today; - var factories = _currentUser.GetUserClaim("tenants").Split(",").ToList(); var device = await _dbContext.Queryable().Where(x => x.Code == request.UniqueValue).SingleAsync(); device.ThrowIfNull("设备不存在"); - //删除当前匹配的基地权限 - var p = await _dbContext.Queryable() - .Where(x => x.UniqueType == request.UniqueType) + //当前匹配的基地权限 + var dps = await _dbContext.Queryable() + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device) .Where(x => x.UniqueValue == request.UniqueValue) - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.Type == request.Type) + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.Type == device.Type) .Where(x => x.TenantId == currentTenantId) .ToListAsync(); - var beforeNos = p.Select(x => x.AssignValue).ToList(); - var presentNos = new List(); + var beforeUserNos = dps.Select(x => x.AssignValue).ToList(); + var presentUserNos = new List(); + if (request.Values.IsPresent()) { - presentNos = await _dbContext.Client.Queryable() + var today = DateTime.Today; + var factories = _currentUser.GetUserClaim("tenants").Split(",").ToList(); + presentUserNos = await _dbContext.Client.Queryable() .Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable() .Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today)) .Any() @@ -76,57 +77,83 @@ public class DevicePermissionService : IDevicePermissionService .Where(gainfo => request.Values.Contains(gainfo.Code) || request.Values.Contains(gainfo.No) || request.Values.Contains(gainfo.IdNo)) .Select(gainfo => gainfo.No) .ToListAsync(); - - //gainfoNos = gainfoNos.Concat(nos).Distinct().ToList(); } - var adds = presentNos.Except(beforeNos); - var deletes = beforeNos.Except(presentNos); + var tasksToAdd = new List(); + var tasksToDelete = new List(); - await _dbContext.DeleteAsync(p); - var devicePermissions = presentNos.Select(v => new DevicePermissionEntity + try { - UniqueType = request.UniqueType, - UniqueValue = request.UniqueValue, - AssignType = request.AssignType, - AssignValue = v, - TenantId = currentTenantId, - Type = request.Type - }).ToList(); + var usersToAdd = presentUserNos.Except(beforeUserNos); + var usersToDelete = beforeUserNos.Except(presentUserNos).ToList(); - await _dbContext.InsertAsync(devicePermissions); + var userTenantDeviceCodes = usersToDelete.IsPresent() + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(beforeUserNos.Union(presentUserNos).ToList()) + : new Dictionary>(); - await _dbContext.InsertAsync(adds.Select(x => new DeviceTaskEntity + tasksToAdd.AddRange(usersToAdd.Select(userNo => new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Add, + DeviceType = device.Type, + UserId = null, + UserNo = userNo, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 20, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = currentTenantId, + })); + + foreach (var item in usersToDelete) + { + var permissions = userTenantDeviceCodes[item].ToList(); + foreach (var permission in permissions) + { + permission.AssignTypes = permission.AssignTypes.Where(x => x.UniqueType != DeviceAssignmentTypeEnumType.Device).ToList(); + } + + var myDeviceCodes = permissions.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList(); + if (myDeviceCodes.All(x => x != device.Code)) + { + tasksToDelete.Add(new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Delete, + DeviceType = device.Type, + UserId = null, + UserNo = item, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 20, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = currentTenantId + }); + } + } + } + finally { - Type = DeviceTaskEnumType.Add, - DeviceType = device.Type, - UserId = null, - UserNo = x, - DeviceUniqueNo = device.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = currentTenantId, - }).ToList()); + await _dbContext.InsertAsync(tasksToAdd); + await _dbContext.InsertAsync(tasksToDelete); - await _dbContext.InsertAsync(deletes.Select(x => new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Delete, - DeviceType = device.Type, - UserId = null, - UserNo = x, - DeviceUniqueNo = device.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = currentTenantId - }).ToList()); + await _dbContext.DeleteAsync(dps); + await _dbContext.InsertAsync(presentUserNos.Select(v => new DevicePermissionEntity + { + UniqueType = DeviceAssignmentTypeEnumType.Device, + UniqueValue = request.UniqueValue, + AssignType = AssignTypeEnumType.User, + AssignValue = v, + TenantId = currentTenantId, + Type = device.Type + }).ToList()); + } + + return new DevicePermissionAssignResponse(tasksToAdd.Count, tasksToDelete.Count); } /// diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs index 1b3cb8fd..f740694f 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs @@ -51,7 +51,7 @@ public class GainfoPermissionsController : ControllerBase /// /// [HttpGet("assignDeviceCodes")] - public async Task> GetAssignDeviceCodesAsync([FromQuery] DeviceAssRequest request) + public async Task> GetAssignDeviceCodesAsync([FromQuery] DeviceAssRequest request) { return await _gainfoPermissions.GetAssignDeviceCodesAsync(request); } diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs new file mode 100644 index 00000000..0a49cbd3 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs @@ -0,0 +1,69 @@ +using Dlhis.Basic.Device.Dtos; +using Dlhis.Entity.Device.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.Organization.Response; + +public class GainfoDevicePermissionResponse +{ + public long Id { get; set; } + + /// + /// 设备code + /// + public Guid Code { get; set; } + + /// + /// 设备码,IP/MAC/SNO + /// + public string UniqueNo { get; set; } + + /// + /// 心跳间隔 + /// + public int HeartbeatInterval { get; set; } + + /// + /// 设备机功能类型 + /// + public DeviceTypeEnumType Type { get; set; } + + public string TypeDescription => Type.GetDescription(); + + /// + /// 是否启用 + /// + public bool Enable { get; set; } + + /// + /// 厂区 + /// + public string Factory { get; set; } + + /// + /// 最后心跳时间 + /// + public DateTime? LastHeartbeatTime { get; set; } + + /// + /// 是否在线 + /// + public bool IsOnline + { + get + { + if (!LastHeartbeatTime.HasValue) + return false; + + if (HeartbeatInterval <= 0) + return true; + + return LastHeartbeatTime.Value.AddSeconds(HeartbeatInterval) >= DateTime.Now; + } + } + + /// + /// 分配来源 + /// + public DevicePermissionSourceDto Source { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs index a5b7caed..544479bb 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs @@ -13,7 +13,7 @@ public interface IGainfoPermissionService : IScopeDependency Task> GetDevicesUnderGroupByUserNoAsync(string userNo, Guid deviceGroupCode); - Task> GetAssignDeviceCodesAsync(DeviceAssRequest request); + Task> GetAssignDeviceCodesAsync(DeviceAssRequest request); Task> GetAssignGroupAsync(string userNo); diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index 49609e4b..f0e15b8c 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -93,8 +93,7 @@ public class GainfoGroupService : IGainfoGroupService var relations = await _dbContext.Queryable() .Where(x => x.GroupCode == request.GroupCode) .ToListAsync(); - - + var presentUserNos = await _dbContext.Queryable() .Where(x => request.UserNos.Contains(x.No) || request.UserNos.Contains(x.Code)) //NO和工号匹配 .Select(x => x.No) diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs index 5889d5ef..69691702 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs @@ -1,4 +1,5 @@ -using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Basic.Device.Services; using Dlhis.Basic.Organization.Request; @@ -118,27 +119,39 @@ public class GainfoPermissionService : IGainfoPermissionService }).ToList(); } - public async Task> GetAssignDeviceCodesAsync(DeviceAssRequest request) + public async Task> GetAssignDeviceCodesAsync(DeviceAssRequest request) { - var ids = await _devicePermissionAnalyzeService.GetAssignDeviceCodesAsync(request.UserNo); + var result = await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(new List { request.UserNo }); + var permissions = result[request.UserNo].ToList(); + + var codes = permissions.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList(); var page = await _dbContext.Queryable() - .LeftJoin((d, dt) => d.TemplateCode == dt.Code) - .LeftJoin((d, dt, dr) => d.UniqueNo == dr.DeviceUniqueNo) - .LeftJoin((d, dt, dr, bp) => dr.BusinessPlaceCode == bp.Code) + .LeftJoin((d, dr) => d.UniqueNo == dr.DeviceUniqueNo) .WhereIF(request.DeviceType.HasValue, d => d.Type == request.DeviceType) - .Where(d => ids.Contains(d.Code)) - .Select((d, dt, dr, bp) => new DevicePageResponse - { - FuncsStr = d.Funcs.ToString(), - Brand = dt.Brand, - Type = d.Type, - BusinessPlaceCode = bp.Code, - BusinessPlaceName = bp.Name, - LastHeartbeatTime = dr.LastHeartbeatTime - }, true) + .Where(d => codes.Contains(d.Code)) + .Select((d, dr) => new GainfoDevicePermissionResponse { Factory = d.TenantId }, true) .ToPageListAsync(request); + page.Data.ForEach(item => + { + var permission = permissions.First(x => x.Tenant == item.Factory); + + item.Source = new DevicePermissionSourceDto + { + Factory = item.Factory, + Types = permission.AssignTypes.Where(x => x.Codes.Any(p => p == item.Code)).Select(x => new DevicePermissionSourceTypeDto + { + AssignType = x.AssignType, + AssignValue = x.AssignValue, + UniqueType = x.UniqueType, + Codes = x.UniqueType == DeviceAssignmentTypeEnumType.Device + ? x.Codes.Where(p => p == item.Code) + : x.Codes.Take(1) + }) + }; + }); + return page; } From 342b8ca0e7f52e6c847be9ebd0bd39557088c383 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 12 Dec 2024 17:14:46 +0800 Subject: [PATCH 19/22] =?UTF-8?q?fix=20=E4=B8=AD=E6=96=87=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Device/Dtos/DevicePermissionSourceDto.cs | 2 + .../GainfoDevicePermissionResponse.cs | 6 +++ .../Implements/GainfoPermissionService.cs | 44 ++++++++++++++++--- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs index 518cf49d..1f4875ec 100644 --- a/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs +++ b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs @@ -24,4 +24,6 @@ public class DevicePermissionSourceTypeDto public DeviceAssignmentTypeEnumType UniqueType { get; set; } public IEnumerable Codes { get; set; } + + public string CodeDesc { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs index 0a49cbd3..25b41166 100644 --- a/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs +++ b/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs @@ -22,6 +22,12 @@ public class GainfoDevicePermissionResponse /// 心跳间隔 /// public int HeartbeatInterval { get; set; } + + + /// + /// 部署点 + /// + public string DeployPlace { get; set; } /// /// 设备机功能类型 diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs index 69691702..d1f0e97a 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs @@ -133,6 +133,15 @@ public class GainfoPermissionService : IGainfoPermissionService .Select((d, dr) => new GainfoDevicePermissionResponse { Factory = d.TenantId }, true) .ToPageListAsync(request); + var deviceGroups = await _dbContext.Queryable().Select(x => new { x.Code, x.Name }).ToListAsync(); + var departments = permissions.Any(x => x.AssignTypes.Any(p => p.AssignType == AssignTypeEnumType.Department)) + ? await _dbContext.Queryable().Select(x => new { x.No, x.Name }).ToListAsync() + : new[] { new { No = string.Empty, Name = string.Empty } }.ToList(); + + var userGroups = permissions.Any(x => x.AssignTypes.Any(p => p.AssignType == AssignTypeEnumType.Group)) + ? await _dbContext.Queryable().Select(x => new { x.Code, x.Name }).ToListAsync() + : new[] { new { Code = Guid.Empty, Name = string.Empty } }.ToList(); + page.Data.ForEach(item => { var permission = permissions.First(x => x.Tenant == item.Factory); @@ -140,14 +149,35 @@ public class GainfoPermissionService : IGainfoPermissionService item.Source = new DevicePermissionSourceDto { Factory = item.Factory, - Types = permission.AssignTypes.Where(x => x.Codes.Any(p => p == item.Code)).Select(x => new DevicePermissionSourceTypeDto + Types = permission.AssignTypes.Where(x => x.Codes.Any(p => p == item.Code)).Select(x => { - AssignType = x.AssignType, - AssignValue = x.AssignValue, - UniqueType = x.UniqueType, - Codes = x.UniqueType == DeviceAssignmentTypeEnumType.Device - ? x.Codes.Where(p => p == item.Code) - : x.Codes.Take(1) + var codeDesc = x.UniqueType == DeviceAssignmentTypeEnumType.Device + ? item.DeployPlace + : deviceGroups.First(p => p.Code == x.Codes.First()).Name; + + var currentAssignValue = x.AssignValue; + if (x.AssignType == AssignTypeEnumType.Department) + { + currentAssignValue = departments.First(p => p.No == x.AssignValue.Split(":")[1]).Name; + } + + if (x.AssignType == AssignTypeEnumType.Group) + { + currentAssignValue = userGroups.First(p => p.Code == Guid.Parse(currentAssignValue)).Name; + } + + var r = new DevicePermissionSourceTypeDto + { + AssignType = x.AssignType, + AssignValue = currentAssignValue, + UniqueType = x.UniqueType, + Codes = x.UniqueType == DeviceAssignmentTypeEnumType.Device + ? x.Codes.Where(p => p == item.Code) + : x.Codes.Take(1), + CodeDesc = codeDesc + }; + + return r; }) }; }); From 1dc31722557b36de3df402c0d51762019c4c3e10 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 12 Dec 2024 17:28:41 +0800 Subject: [PATCH 20/22] =?UTF-8?q?fix=20=E5=88=86=E7=BB=84=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Implements/GainfoPermissionService.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs index d1f0e97a..e22b705d 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs @@ -153,7 +153,7 @@ public class GainfoPermissionService : IGainfoPermissionService { var codeDesc = x.UniqueType == DeviceAssignmentTypeEnumType.Device ? item.DeployPlace - : deviceGroups.First(p => p.Code == x.Codes.First()).Name; + : deviceGroups.First(p => p.Code == x.OriginalCodes.First()).Name; var currentAssignValue = x.AssignValue; if (x.AssignType == AssignTypeEnumType.Department) @@ -166,6 +166,11 @@ public class GainfoPermissionService : IGainfoPermissionService currentAssignValue = userGroups.First(p => p.Code == Guid.Parse(currentAssignValue)).Name; } + if (x.AssignType == AssignTypeEnumType.User) + { + currentAssignValue = "自己"; + } + var r = new DevicePermissionSourceTypeDto { AssignType = x.AssignType, From e13e5cfc6f858ef7a9de0bae8a81a21d2f35c560 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 12 Dec 2024 18:45:02 +0800 Subject: [PATCH 21/22] =?UTF-8?q?feat=20=E6=9D=83=E9=99=90=E9=87=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GainfoPermissionsController.cs | 13 ++++++++++ .../Request/GainfoPermissionResetRequest.cs | 14 +++++++++++ .../Services/IGainfoPermissionService.cs | 2 +- .../Implements/GainfoPermissionService.cs | 25 ++++++------------- 4 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 Src/Dlhis.Basic/Organization/Request/GainfoPermissionResetRequest.cs diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs index f740694f..1801ea53 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs @@ -3,6 +3,7 @@ using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Basic.Organization.Services; using Dlhis.Basic.Places.Response; +using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.DataAccess.Dto; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -65,4 +66,16 @@ public class GainfoPermissionsController : ControllerBase { return await _gainfoPermissions.GetAssignGroupAsync(userNo); } + + /// + /// 权限重置 + /// + /// + /// + [Authorize(Roles = "admin")] + [HttpPost("reset")] + public async Task ResetPermissionsAsync(GainfoPermissionResetRequest request) + { + return await _gainfoPermissions.ResetPermissionsAsync(request.UserNo, request.Status ? DeviceTaskEnumType.Add : DeviceTaskEnumType.Delete, null); + } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoPermissionResetRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoPermissionResetRequest.cs new file mode 100644 index 00000000..71d6e26b --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Request/GainfoPermissionResetRequest.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Organization.Request; + +public class GainfoPermissionResetRequest +{ + [Required] + public string UserNo { get; set; } + + /// + /// true下发所有,false删除所有 + /// + public bool Status { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs index 544479bb..03ce1e5b 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs @@ -17,5 +17,5 @@ public interface IGainfoPermissionService : IScopeDependency Task> GetAssignGroupAsync(string userNo); - Task ResetPermissionsAsync(string userNo, DeviceTaskEnumType type, List deviceCodes); + Task ResetPermissionsAsync(string userNo, DeviceTaskEnumType type, List deviceCodes); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs index e22b705d..4867ada3 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs @@ -33,7 +33,7 @@ public class GainfoPermissionService : IGainfoPermissionService { var gainfo = await _gainfoStore.Queryable() .Where(x => x.No == request.UserNo) - .FirstAsync(); + .SingleAsync(); if (gainfo == null) { @@ -77,7 +77,7 @@ public class GainfoPermissionService : IGainfoPermissionService return new List(); } - var groups = RecursionGetNext(currentGroup, deviceGroups).ToList(); + var groups = RecursionHelper.HandlerDeviceGroupNextCodes(currentGroup.Code, deviceGroups); return groups.Select(groupCode => { @@ -191,7 +191,7 @@ public class GainfoPermissionService : IGainfoPermissionService } - public async Task ResetPermissionsAsync(string userNo, DeviceTaskEnumType type, List deviceCodes) + public async Task ResetPermissionsAsync(string userNo, DeviceTaskEnumType type, List deviceCodes) { var gainfo = await _dbContext.Queryable() .Where(x => x.No == userNo) @@ -230,10 +230,14 @@ public class GainfoPermissionService : IGainfoPermissionService DeviceType = x.Type, TenantId = x.TenantId, Priority = 10, - Source = DeviceTaskSourceEnumType.Manually + Source = DeviceTaskSourceEnumType.Manually, }).ToList(); await _dbContext.InsertAsync(tasks); + + var addCount = type == DeviceTaskEnumType.Add ? tasks.Count : 0; + var deleteCount = type == DeviceTaskEnumType.Delete ? tasks.Count : 0; + return new DevicePermissionAssignResponse(addCount, deleteCount); } @@ -252,17 +256,4 @@ public class GainfoPermissionService : IGainfoPermissionService .Select() .ToListAsync(); } - - //********************************************************************************************************************************************** - - private static IEnumerable RecursionGetNext(DeviceGroupEntity current, List deviceGroups) - { - var next = deviceGroups.Where(x => x.PCode == current.Code).ToList(); - foreach (var item in next) - { - RecursionGetNext(item, deviceGroups); - } - - yield return current.Code; - } } \ No newline at end of file From 1ef1a55c6aff2fe1165fa8d5ac86ef180302d37a Mon Sep 17 00:00:00 2001 From: liguoyang Date: Fri, 13 Dec 2024 16:31:04 +0800 Subject: [PATCH 22/22] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E5=B7=B2?= =?UTF-8?q?=E7=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dlhis.Jinko.Face.sln | 7 + .../Services/Implements/AppointmentService.cs | 29 +++- Src/Dlhis.Basic/Dlhis.Basic.csproj | 1 + Src/Dlhis.Basic/Dockerfile | 12 +- .../GainfoPermissionsController.cs | 21 --- .../Services/IGainfoPermissionService.cs | 4 - .../Implements/GainfoPermissionService.cs | 56 +------- Src/Dlhis.Dh.Api/Dlhis.Dh.Api.csproj | 13 ++ Src/Dlhis.Dh.Api/IDhApi.cs | 13 ++ Src/Dlhis.Dh.Api/Requests/FaceRequest.cs | 14 ++ .../ResultHandlers/DhResultHandler.cs | 43 ++++++ .../Sys/Enums/AssignTypeEnumType.cs | 2 +- .../Apis/Handlers/HealthzClientHandler.cs | 27 ++-- Src/Dlhis.Middle/Dlhis.Middle.csproj | 1 + Src/Dlhis.Middle/Packs/SqlSugarPack.cs | 127 +----------------- Src/Dlhis.Middle/Program.cs | 2 + .../Implements/DeviceUploadLogService.cs | 15 ++- 17 files changed, 162 insertions(+), 225 deletions(-) create mode 100644 Src/Dlhis.Dh.Api/Dlhis.Dh.Api.csproj create mode 100644 Src/Dlhis.Dh.Api/IDhApi.cs create mode 100644 Src/Dlhis.Dh.Api/Requests/FaceRequest.cs create mode 100644 Src/Dlhis.Dh.Api/ResultHandlers/DhResultHandler.cs diff --git a/Dlhis.Jinko.Face.sln b/Dlhis.Jinko.Face.sln index 3a2f5093..8ab23f97 100644 --- a/Dlhis.Jinko.Face.sln +++ b/Dlhis.Jinko.Face.sln @@ -45,6 +45,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.InfoCheck.Api", "Src\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.Jip.Api", "Src\Dlhis.Jip.Api\Dlhis.Jip.Api.csproj", "{841B7B43-5394-413F-9D68-A07EBDD6D4CD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.Dh.Api", "Src\Dlhis.Dh.Api\Dlhis.Dh.Api.csproj", "{E673CA04-3567-4E03-9A86-994F50291ACC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -111,6 +113,10 @@ Global {841B7B43-5394-413F-9D68-A07EBDD6D4CD}.Debug|Any CPU.Build.0 = Debug|Any CPU {841B7B43-5394-413F-9D68-A07EBDD6D4CD}.Release|Any CPU.ActiveCfg = Release|Any CPU {841B7B43-5394-413F-9D68-A07EBDD6D4CD}.Release|Any CPU.Build.0 = Release|Any CPU + {E673CA04-3567-4E03-9A86-994F50291ACC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E673CA04-3567-4E03-9A86-994F50291ACC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E673CA04-3567-4E03-9A86-994F50291ACC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E673CA04-3567-4E03-9A86-994F50291ACC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -127,6 +133,7 @@ Global {4D656761-8CE7-4316-A3DF-8C1722D69CCE} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A} {A501D16E-638F-4156-989C-2BACCC2FAC2B} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A} {841B7B43-5394-413F-9D68-A07EBDD6D4CD} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A} + {E673CA04-3567-4E03-9A86-994F50291ACC} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7439494A-E2FD-4FEA-8ABF-74AE57A4A5A0} diff --git a/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentService.cs b/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentService.cs index 4fc51e33..46ccebb6 100644 --- a/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentService.cs +++ b/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentService.cs @@ -2,6 +2,8 @@ using Dlhis.Basic.Appointment.Response; using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Services; +using Dlhis.Dh.Api; +using Dlhis.Dh.Api.Requests; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; @@ -24,16 +26,22 @@ public class AppointmentService : IAppointmentService private readonly IDbContext _dbContext; private readonly IDataProtectionProvider _dataProtectionProvider; private readonly ICurrentUser _currentUser; + private readonly IDhApi _dhApi; + private readonly ILogger _logger; private readonly IGainfoFaceService _gainfoFaceService; public AppointmentService(IDbContext dbContext, IDataProtectionProvider dataProtectionProvider, ICurrentUser currentUser, - IGainfoFaceService gainfoFaceService) + IDhApi dhApi, + IGainfoFaceService gainfoFaceService, + ILogger logger) { _dbContext = dbContext; _dataProtectionProvider = dataProtectionProvider; _currentUser = currentUser; + _dhApi = dhApi; + _logger = logger; _gainfoFaceService = gainfoFaceService; } @@ -44,7 +52,11 @@ public class AppointmentService : IAppointmentService return await _dbContext.Queryable() .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.Date >= request.SearchDateTimePeriod.Start && x.Date <= request.SearchDateTimePeriod.End) - .WhereIF(request.Search.IsPresent(), x => x.Code == request.Search) + .WhereIF(request.Search.IsPresent(), x => x.Code == request.Search || + SqlFunc.Subqueryable() + .Where(p => p.No != x.No) + .Where(p => p.IdNo == request.Search || p.Name == request.Search).Any() + ) .Where(x => x.Factory == factory) .Select() .ToPageListAsync(request); @@ -94,6 +106,19 @@ public class AppointmentService : IAppointmentService detail.ArrivedTime = DateTime.Now; await _dbContext.UpdateAsync(detail); + + try + { + await _dhApi.SendFaceAsync(new FaceRequest + { + IdNo = detail.IdNo, + Face = request.Base64Image + }); + } + catch (Exception e) + { + _logger.LogError(e, "上传face数据到大华失败:{msg}", e.Message); + } } public async Task GenerateTaskAndUpdateFaceAsync(long detailId, string base64, DeviceTaskEnumType deviceTaskType) diff --git a/Src/Dlhis.Basic/Dlhis.Basic.csproj b/Src/Dlhis.Basic/Dlhis.Basic.csproj index 35ddb2dd..eb9f5b54 100644 --- a/Src/Dlhis.Basic/Dlhis.Basic.csproj +++ b/Src/Dlhis.Basic/Dlhis.Basic.csproj @@ -26,6 +26,7 @@ + diff --git a/Src/Dlhis.Basic/Dockerfile b/Src/Dlhis.Basic/Dockerfile index 27321d53..163112c5 100644 --- a/Src/Dlhis.Basic/Dockerfile +++ b/Src/Dlhis.Basic/Dockerfile @@ -1,27 +1,33 @@ -#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. +# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。 +# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 + +# 此阶段用于生成服务项目 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Src/Dlhis.Basic/Dlhis.Basic.csproj", "Src/Dlhis.Basic/"] +COPY ["Src/Dlhis.Dh.Api/Dlhis.Dh.Api.csproj", "Src/Dlhis.Dh.Api/"] COPY ["Src/Dlhis.Entity/Dlhis.Entity.csproj", "Src/Dlhis.Entity/"] COPY ["Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj", "Src/Dlhis.DataPermission.Model/"] COPY ["Src/Dlhis.InfoCheck.Api/Dlhis.InfoCheck.Api.csproj", "Src/Dlhis.InfoCheck.Api/"] -COPY ["Src/Dlhis.Scheduled.Api/Dlhis.Scheduled.Api.csproj", "Src/Dlhis.Scheduled.Api/"] +COPY ["Src/Dlhis.Jip.Api/Dlhis.Jip.Api.csproj", "Src/Dlhis.Jip.Api/"] COPY ["Src/Dlhis.Sys.Api/Dlhis.Sys.Api.csproj", "Src/Dlhis.Sys.Api/"] -RUN dotnet restore "./Src/Dlhis.Basic/./Dlhis.Basic.csproj" +RUN dotnet restore "./Src/Dlhis.Basic/Dlhis.Basic.csproj" COPY . . WORKDIR "/src/Src/Dlhis.Basic" RUN dotnet build "./Dlhis.Basic.csproj" -c $BUILD_CONFIGURATION -o /app/build +# 此阶段用于发布要复制到最终阶段的服务项目 FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./Dlhis.Basic.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false +# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值) FROM base AS final WORKDIR /app COPY --from=publish /app/publish . diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs index 1801ea53..822ca79d 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs @@ -23,17 +23,6 @@ public class GainfoPermissionsController : ControllerBase _gainfoPermissions = gainfoPermissions; } - /// - /// 根据用户查看餐饮点 - /// - /// - /// - [HttpGet("placesByGainfo")] - public async Task> GetPlaceByGainfoAsync([FromQuery] DeviceAssRequest request) - { - return await _gainfoPermissions.GetPlaceByGainfoAsync(request); - } - /// /// 根据档案号 设备组查询设备 /// @@ -57,16 +46,6 @@ public class GainfoPermissionsController : ControllerBase return await _gainfoPermissions.GetAssignDeviceCodesAsync(request); } - /// - /// 当前绑定的设备组信息 - /// - /// - [HttpGet("assignGroups")] - public async Task> GetAssignGroupAsync(string userNo) - { - return await _gainfoPermissions.GetAssignGroupAsync(userNo); - } - /// /// 权限重置 /// diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs index 03ce1e5b..c5b15bb0 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs @@ -9,13 +9,9 @@ namespace Dlhis.Basic.Organization.Services; public interface IGainfoPermissionService : IScopeDependency { - Task> GetPlaceByGainfoAsync(DeviceAssRequest request); - Task> GetDevicesUnderGroupByUserNoAsync(string userNo, Guid deviceGroupCode); Task> GetAssignDeviceCodesAsync(DeviceAssRequest request); - Task> GetAssignGroupAsync(string userNo); - Task ResetPermissionsAsync(string userNo, DeviceTaskEnumType type, List deviceCodes); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs index 4867ada3..0a65dcd7 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs @@ -29,44 +29,6 @@ public class GainfoPermissionService : IGainfoPermissionService _dbContext = dbContext; } - public async Task> GetPlaceByGainfoAsync(DeviceAssRequest request) - { - var gainfo = await _gainfoStore.Queryable() - .Where(x => x.No == request.UserNo) - .SingleAsync(); - - if (gainfo == null) - { - return new Pagination(); - } - - //用户所有deviceCode权限 - var deviceCodes = await _devicePermissionAnalyzeService.GetAssignDeviceCodesAsync(gainfo.Code); - - return await _dbContext.Queryable() - .LeftJoin((x, dr) => x.UniqueNo == dr.DeviceUniqueNo) - .LeftJoin((x, dr, place) => dr.BusinessPlaceCode == place.Code) - .LeftJoin((x, dr, place, ps) => place.Code == ps.PlaceCode) - .LeftJoin((x, dr, place, ps, s) => s.Code == ps.ShiftCode) - .Where(x => x.Type == DeviceTypeEnumType.Meal) - .Where(x => deviceCodes.Contains(x.Code)) - .Where((x, dr) => dr.BusinessPlaceCode.HasValue) - .Select((x, dr, place, ps, s) => new BusinessPlaceResponse - { - Id = place.Id, - Code = place.Code, - Status = place.Status, - Name = place.Name, - Catalog = place.Catalog, - CustomCode = place.CustomCode, - Source = place.Source, - - ShiftCode = s.Code, - ShiftName = s.Name - }) - .Distinct() - .ToPageListAsync(request); - } public async Task> GetDevicesUnderGroupByUserNoAsync(string userNo, Guid deviceGroupCode) { @@ -129,6 +91,7 @@ public class GainfoPermissionService : IGainfoPermissionService var page = await _dbContext.Queryable() .LeftJoin((d, dr) => d.UniqueNo == dr.DeviceUniqueNo) .WhereIF(request.DeviceType.HasValue, d => d.Type == request.DeviceType) + .WhereIF(request.Search.IsPresent(), d => d.UniqueNo == request.Search) .Where(d => codes.Contains(d.Code)) .Select((d, dr) => new GainfoDevicePermissionResponse { Factory = d.TenantId }, true) .ToPageListAsync(request); @@ -239,21 +202,4 @@ public class GainfoPermissionService : IGainfoPermissionService var deleteCount = type == DeviceTaskEnumType.Delete ? tasks.Count : 0; return new DevicePermissionAssignResponse(addCount, deleteCount); } - - - public async Task> GetAssignGroupAsync(string userNo) - { - //(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo - var groups = await _devicePermissionAnalyzeService.GetAssignmentsAsync(new DeviceGetAssignmentsRequest - { - UniqueType = DeviceAssignmentTypeEnumType.Group, - AssignType = AssignTypeEnumType.User, - AssignValue = userNo - }); - - return await _dbContext.Queryable() - .Where(x => groups.Contains(x.Code)) - .Select() - .ToListAsync(); - } } \ No newline at end of file diff --git a/Src/Dlhis.Dh.Api/Dlhis.Dh.Api.csproj b/Src/Dlhis.Dh.Api/Dlhis.Dh.Api.csproj new file mode 100644 index 00000000..b41f2841 --- /dev/null +++ b/Src/Dlhis.Dh.Api/Dlhis.Dh.Api.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + disable + + + + + + + diff --git a/Src/Dlhis.Dh.Api/IDhApi.cs b/Src/Dlhis.Dh.Api/IDhApi.cs new file mode 100644 index 00000000..b6f97acd --- /dev/null +++ b/Src/Dlhis.Dh.Api/IDhApi.cs @@ -0,0 +1,13 @@ +using Dlhis.Dh.Api.Requests; +using Dlhis.Dh.Api.ResultHandlers; +using Kurisu.RemoteCall.Attributes; + +namespace Dlhis.Dh.Api; + +[EnableRemoteClient(Name = "dh-service", BaseUrl = "https://10.32.0.100")] +public interface IDhApi +{ + [Post("/evo-apigw/evo-visitor/1.0.0/card/visitor/custom-face")] + [RequestResultHandler(typeof(DhResultHandler))] + Task SendFaceAsync(FaceRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Dh.Api/Requests/FaceRequest.cs b/Src/Dlhis.Dh.Api/Requests/FaceRequest.cs new file mode 100644 index 00000000..0ed7760a --- /dev/null +++ b/Src/Dlhis.Dh.Api/Requests/FaceRequest.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; + +namespace Dlhis.Dh.Api.Requests; + +public class FaceRequest +{ + [JsonProperty("v_certificateNumber")] + public string IdNo { get; set; } + + public string Face { get; set; } + + [JsonProperty("faceFile")] + public string FaceFile => "data:image/jpeg;base64," + Face; +} \ No newline at end of file diff --git a/Src/Dlhis.Dh.Api/ResultHandlers/DhResultHandler.cs b/Src/Dlhis.Dh.Api/ResultHandlers/DhResultHandler.cs new file mode 100644 index 00000000..515f127f --- /dev/null +++ b/Src/Dlhis.Dh.Api/ResultHandlers/DhResultHandler.cs @@ -0,0 +1,43 @@ +using System.Net; +using Kurisu.RemoteCall.Abstractions; +using Mapster; +using Newtonsoft.Json; + +namespace Dlhis.Dh.Api.ResultHandlers; + +public class DhResultHandler : IRemoteCallResultHandler +{ + /// + public TResult Handle(HttpStatusCode statusCode, string responseBody) + { + var apiResult = JsonConvert.DeserializeObject(responseBody)!; + + var isSuccessStatusCode = ((int)statusCode >= 200) && ((int)statusCode <= 299); + if (!isSuccessStatusCode || apiResult.Success == false) + { + if (!string.IsNullOrEmpty(apiResult.ErrMsg)) + { + throw new Exception(apiResult.ErrMsg); + } + + throw new HttpRequestException(statusCode + " " + (int)statusCode); + } + + return responseBody.Adapt(); + } +} + +public class DhResponse +{ + public bool Success { get; set; } + + public string Code { get; set; } + + public string ErrMsg { get; set; } +} + +// { +// "success": true, +// "code": "0", +// "errMsg": "请求成功" +// } \ No newline at end of file diff --git a/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs b/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs index 7b96e746..8a9dba9f 100644 --- a/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs +++ b/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs @@ -35,6 +35,6 @@ public enum AssignTypeEnumType /// /// 租户/基地 /// - [Description("租户/基地")] + [Description("厂区")] Tenant = 5 } \ No newline at end of file diff --git a/Src/Dlhis.Middle/Apis/Handlers/HealthzClientHandler.cs b/Src/Dlhis.Middle/Apis/Handlers/HealthzClientHandler.cs index 9cffe733..ccef750e 100644 --- a/Src/Dlhis.Middle/Apis/Handlers/HealthzClientHandler.cs +++ b/Src/Dlhis.Middle/Apis/Handlers/HealthzClientHandler.cs @@ -1,4 +1,7 @@ +using System.Net; using Kurisu.RemoteCall.Abstractions; +using Polly; +using Polly.Extensions.Http; namespace Dlhis.Middle.Apis.Handlers; @@ -8,16 +11,24 @@ public class HealthzClientHandler : IHttpRemoteCallPolicyHandler public IHttpClientBuilder ConfigureHttpClient(IHttpClientBuilder builder) { builder.ConfigureHttpClient(client => { client.Timeout = TimeSpan.FromSeconds(10); }).ConfigurePrimaryHttpMessageHandler(() => - { - var handler = new HttpClientHandler { - ClientCertificateOptions = ClientCertificateOption.Manual, - ServerCertificateCustomValidationCallback = (_, _, _, _) => true - }; + var handler = new HttpClientHandler + { + ClientCertificateOptions = ClientCertificateOption.Manual, + ServerCertificateCustomValidationCallback = (_, _, _, _) => true + }; + + return handler; + }) + //.SetHandlerLifetime(TimeSpan.FromMinutes(5)) + .AddPolicyHandler( + HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(x => x.StatusCode != HttpStatusCode.OK) + //.OrResult(msg => msg.StatusCode != HttpStatusCode.OK) + .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))) + ); - return handler; - }); - return builder; } } \ No newline at end of file diff --git a/Src/Dlhis.Middle/Dlhis.Middle.csproj b/Src/Dlhis.Middle/Dlhis.Middle.csproj index 07f7413e..ce0a4696 100644 --- a/Src/Dlhis.Middle/Dlhis.Middle.csproj +++ b/Src/Dlhis.Middle/Dlhis.Middle.csproj @@ -19,6 +19,7 @@ + diff --git a/Src/Dlhis.Middle/Packs/SqlSugarPack.cs b/Src/Dlhis.Middle/Packs/SqlSugarPack.cs index b9c95a03..06656513 100644 --- a/Src/Dlhis.Middle/Packs/SqlSugarPack.cs +++ b/Src/Dlhis.Middle/Packs/SqlSugarPack.cs @@ -1,136 +1,13 @@ -using Dlhis.Middle.Entities; -using Kurisu.AspNetCore.Authentication.Abstractions; -using Kurisu.AspNetCore.DataAccess.Entity; -using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes; -using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; -using Kurisu.AspNetCore.DataAccess.SqlSugar.Options; -using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.Startup; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Options; using SqlSugar; namespace Dlhis.Middle.Packs; public class SqlSugarPack : BaseAppPack { - private const string _infoTemplate = "ExecuteCommand[{ms}] Timeout[{timeout}] \r\n {sql}"; - public override void ConfigureServices(IServiceCollection services) { - services.AddSqlSugar(); - services.Replace(ServiceDescriptor.Scoped(typeof(ISqlSugarClient), sp => - { - var options = sp.GetService>().Value; - var logger = sp.GetService>(); - var currentUser = sp.GetService(); - var sugarOptions = sp.GetService(); - - var configs = new List - { - new() - { - ConfigId = "db-main", - - ConnectionString = options.DefaultConnectionString, - DbType = DbType.Sqlite, - InitKeyType = InitKeyType.Attribute, - IsAutoCloseConnection = true, - - MoreSettings = new ConnMoreSettings - { - DisableNvarchar = true, - }, - ConfigureExternalServices = new ConfigureExternalServices - { - EntityService = (c, p) => - { - if (!p.IsPrimarykey && c.PropertyType.IsGenericType && c.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) - || (!p.IsPrimarykey && p.PropertyInfo.PropertyType == typeof(string))) - { - p.IsNullable = true; - } - } - } - } - }; - - ISqlSugarClient db = new SqlSugarClient(configs); - - db.Ado.CommandTimeOut = options.Timeout; - - db.Aop.OnLogExecuted = (sql, parameters) => - { - var ms = db.Ado.SqlExecutionTime.Milliseconds; - - //警告慢sql - if (ms >= options.SlowSqlTime * 1000) - logger.LogWarning(message: _infoTemplate, ms, options.Timeout, sql); - - if (options.EnableSqlLog) - { - sql = UtilMethods.GetSqlString(DbType.MySql, sql, parameters); - logger.LogInformation(message: _infoTemplate, ms, options.Timeout, sql); - } - }; - - //软删除 - db.QueryFilter.AddTableFilter(x => x.IsDeleted == false); - - - //增删改 - db.Aop.DataExecuting = (oldValue, model) => - { - if (sugarOptions.IgnoreTenant == false //启用租户 - && currentUser != null //用户信息存在 - && model.PropertyName == nameof(ITenantId.TenantId) //当前为租户字段 - && typeof(ITenantId).IsAssignableFrom(model.EntityValue.GetType())) //继承ITenantId - { - var tenant = currentUser.GetStringTenantId(); - model.SetValue(tenant); - } - - //处理人员和时间字段 - switch (model.OperationType) - { - case DataFilterType.InsertByObject: - { - if (model.IsAnyAttribute()) - { - model.SetValue(DateTime.Now); - } - - if (currentUser != null && model.IsAnyAttribute()) - { - if ((int)model.EntityColumnInfo.PropertyInfo.GetValue(model.EntityValue) == 0) - { - model.SetValue(currentUser.GetStringSubjectId()); - } - } - - break; - } - case DataFilterType.UpdateByObject: - { - if (model.IsAnyAttribute()) - { - model.SetValue(DateTime.Now); - } - - if (currentUser != null && model.IsAnyAttribute()) - { - if ((int)model.EntityColumnInfo.PropertyInfo.GetValue(model.EntityValue) == 0) - { - model.SetValue(currentUser.GetStringSubjectId()); - } - } - - break; - } - } - }; - - return db; - })); + services.AddSqlSugar(DbType.Sqlite); } } \ No newline at end of file diff --git a/Src/Dlhis.Middle/Program.cs b/Src/Dlhis.Middle/Program.cs index b07548a2..8d787f49 100644 --- a/Src/Dlhis.Middle/Program.cs +++ b/Src/Dlhis.Middle/Program.cs @@ -2,6 +2,7 @@ using Dlhis.Middle.BackgroundServices; using Dlhis.Middle.Entities; using Dlhis.Middle.Services; using Kurisu.AspNetCore; +using Kurisu.AspNetCore.Authentication.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Startup; using Microsoft.IdentityModel.Logging; @@ -32,6 +33,7 @@ public class Startup : DefaultStartup services.AddRemoteCall(App.ActiveTypes); services.AddMemoryCache(); + services.AddUserInfo(); } /// diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs index 64f60b9f..df2acb6a 100644 --- a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs @@ -157,20 +157,22 @@ public class DeviceUploadLogService : IDeviceUploadLogService .LeftJoin((os, x) => os.Code == x.UserUniqueNo) .LeftJoin((os, x, device) => x.DeviceUniqueNo == device.UniqueNo) .LeftJoin((os, x, device, ga) => os.Code == ga.Code) - .LeftJoin((os, x, device, ga, gasap) => gasap.Code == os.SapCode) - .WhereIF(request.Search.IsPresent(), (os, x, device, ga, gasap) => + .LeftJoin((os, x, device, ga, gaSap) => gaSap.Code == os.SapCode) + .WhereIF(request.SearchDateTimePeriod.HasValue(), (os, x) => x.RaiseDateTime >= request.SearchDateTimePeriod.Start + && x.RaiseDateTime <= request.SearchDateTimePeriod.End) + .WhereIF(request.Search.IsPresent(), (os, x, device, ga, gaSap) => x.UserUniqueNo == request.Search || x.DeviceUniqueNo == request.Search || os.Supplier == request.Search || os.SapCode == request.Search - ).OrderBy((os, x, device, ga, gasap) => x.ModifiedTime, OrderByType.Desc) - .Select((os, x, device, ga, gasap) => new DeviceUploadLogResponse + ).OrderBy((os, x, device, ga, gaSap) => x.ModifiedTime, OrderByType.Desc) + .Select((os, x, device, ga, gaSap) => new DeviceUploadLogResponse { Id = x.Id, OriginUserUniqueNo = x.UserUniqueNo, OutsourceSupplier = os.Supplier, SapUserCode = os.SapCode, - SapUserName = gasap.Name, + SapUserName = gaSap.Name, DeviceUniqueNo = x.DeviceUniqueNo, RaiseDateTime = x.RaiseDateTime, CreateTime = x.CreateTime, @@ -198,7 +200,8 @@ public class DeviceUploadLogService : IDeviceUploadLogService .LeftJoin((x, device, ga) => x.UserUniqueNo == ga.Code) .LeftJoin((x, device, ga, os) => x.UserUniqueNo == os.Code) .LeftJoin((x, device, ga, os, gasap) => gasap.Code == os.SapCode) - .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.RaiseDateTime >= request.SearchDateTimePeriod.Start && x.RaiseDateTime <= request.SearchDateTimePeriod.End) + .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.RaiseDateTime >= request.SearchDateTimePeriod.Start + && x.RaiseDateTime <= request.SearchDateTimePeriod.End) .Where((x, device) => x.Type == type && !SqlFunc.IsNullOrEmpty(x.UserUniqueNo)) .WhereIF(request.Sync.HasValue, x => x.Sync == request.Sync) .WhereIF(request.IsOutsource.HasValue && request.IsOutsource.Value,