diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index 9e532d2b..ac4563e5 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -1,4 +1,5 @@ using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.Filters; using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Services; using Dlhis.Basic.Organization.Dto; @@ -29,11 +30,25 @@ public class DevicePermissionsController : ControllerBase [HttpPost("assign")] [Transactional] [IgnoreTenant] + [AssignPermissionLimit] public async Task AssignAsync(DevicePermissionSaveRequest request) { await _devicePermissionService.AssignAsync(request); } + /// + /// 分配权限到设备/设备组/营业点 + /// + /// + [HttpPost("assign-unique")] + [Transactional] + [IgnoreTenant] + [AssignPermissionLimit] + public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) + { + await _devicePermissionService.AssignToUniqueAsync(request); + } + [AllowAnonymous] [HttpPost("assignment-generate")] [Transactional] diff --git a/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs new file mode 100644 index 00000000..9d9b6bab --- /dev/null +++ b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs @@ -0,0 +1,24 @@ +using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.Utils; +using Kurisu.AspNetCore.Utils.Extensions; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace Dlhis.Basic.Device.Filters; + +[AttributeUsage(AttributeTargets.Method)] +public class AssignPermissionLimitAttribute : Attribute, IAsyncActionFilter +{ + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + var redisCache = context.HttpContext.RequestServices.GetRequiredService(); + var currentUser = context.HttpContext.RequestServices.GetRequiredService(); + + var currentTenantId = currentUser.GetStringTenantId(); + + 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/Request/DevicePermissionsAssignToDeviceRequest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs new file mode 100644 index 00000000..0a035022 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs @@ -0,0 +1,49 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Sys.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.Device.Request; + +public class DevicePermissionsAssignToDeviceRequest : IValidatableObject +{ + /// + /// 分配类型 + /// + public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + /// + /// 分配值 + /// + public Guid UniqueValue { get; set; } + + /// + /// 来源 + /// + public AssignTypeEnumType AssignType { get; set; } + + /// + /// 来源值 + /// + public List Values { get; set; } + + /// + /// 只删除权限 + /// + public bool IsDelete { get; set; } + + /// + /// AssignType == AssignTypeEnumType.Department 需要传入 + /// + public string TenantId { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if (AssignType == AssignTypeEnumType.Department) + { + if (TenantId.IsEmpty()) + { + yield return new ValidationResult("请明确具体的厂区", new[] { nameof(TenantId) }); + } + } + } +} \ 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 60078ef1..42700ed7 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -16,6 +16,12 @@ public interface IDevicePermissionService : IScopeDependency /// Task AssignAsync(DevicePermissionSaveRequest request); + /// + /// 分配到设备 + /// + /// + /// + Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request); Task GeneratePermissionsAsync(long id); @@ -67,6 +73,6 @@ public interface IDevicePermissionService : IScopeDependency Task ReGeneratePermissionUsersInfoAsync(PermissionUsersInfoDto beforeDto); - + Task> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request); } \ 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 9d242d50..ccedd1a5 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -6,16 +6,13 @@ using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; -using Dlhis.Scheduled.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.Utils; using Kurisu.AspNetCore.Utils.Extensions; using SqlSugar; -using GeneratePermissionIdRequest = Dlhis.Scheduled.Api.Request.GeneratePermissionIdRequest; namespace Dlhis.Basic.Device.Services.Implements; @@ -23,27 +20,16 @@ public class DevicePermissionService : IDevicePermissionService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; - private readonly RedisCache _redisCache; - private readonly IHangfireApi _hangfireApi; public DevicePermissionService(IDbContext dbContext, - ICurrentUser currentUser, - RedisCache redisCache, - IHangfireApi hangfireApi) + ICurrentUser currentUser) { _dbContext = dbContext; _currentUser = currentUser; - _redisCache = redisCache; - _hangfireApi = hangfireApi; } public async Task AssignAsync(DevicePermissionSaveRequest request) { - var currentTenantId = _currentUser.GetStringTenantId(); - - await using var handler = await _redisCache.LockAsync($"permission:generate:{currentTenantId}"); - handler.Acquired.ThrowIfFalse("请勿频繁分配设备权限"); - var tenantId = request.AssignType == AssignTypeEnumType.Department ? request.TenantId : _currentUser.GetStringTenantId(); await GenerateDeviceTasksAsync(async () => @@ -75,6 +61,43 @@ public class DevicePermissionService : IDevicePermissionService }, null); } + public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) + { + var tenantId = request.AssignType == AssignTypeEnumType.Department ? request.TenantId : _currentUser.GetStringTenantId(); + + await GenerateDeviceTasksAsync(async () => + { + //删除当前匹配的基地权限 + var p = await _dbContext.Queryable() + .Where(x => x.UniqueType == request.UniqueType) + .Where(x => x.UniqueValue == request.UniqueValue) + .Where(x => x.AssignType == request.AssignType) + .Where(x => request.Values.Contains(x.AssignValue)) + .Where(x => x.TenantId == tenantId) + .ToListAsync(); + + await _dbContext.DeleteReallyAsync(p); + + if (!request.IsDelete) + { + //保存配置的权限 + if (request.Values.IsPresent()) + { + var devicePermissions = request.Values.Select(v => new DevicePermissionEntity + { + AssignType = request.AssignType, + AssignValue = v, + UniqueType = request.UniqueType, + UniqueValue = request.UniqueValue, + TenantId = tenantId + }).ToList(); + + await _dbContext.InsertAsync(devicePermissions); + } + } + }, null); + } + public async Task GeneratePermissionsAsync(long id) { var assignment = await _dbContext.Queryable().SingleAsync(x => x.Id == id);