diff --git a/Src/Dlhis.Basic.Api/IDevicePermissionApi.cs b/Src/Dlhis.Basic.Api/IDevicePermissionApi.cs index f8ba7dae..f0121db1 100644 --- a/Src/Dlhis.Basic.Api/IDevicePermissionApi.cs +++ b/Src/Dlhis.Basic.Api/IDevicePermissionApi.cs @@ -1,4 +1,5 @@ using Dlhis.Basic.Api.Dto; +using Dlhis.Basic.Api.Request; using Kurisu.RemoteCall.Attributes; using Kurisu.RemoteCall.Default; @@ -25,4 +26,13 @@ public interface IDevicePermissionApi /// [Post("/api/devicepermissions/re-permission")] Task> RePermissionUsersInfoAsync(PermissionUsersInfoDto beforeDto); + + + /// + /// 任务生成 + /// + /// + /// + [Post("/api/devicepermissions/assignment-generate")] + Task GeneratePermissionsAsync(GeneratePermissionIdRequest request); } \ No newline at end of file diff --git a/Src/Dlhis.Basic.Api/Request/GeneratePermissionIdRequest.cs b/Src/Dlhis.Basic.Api/Request/GeneratePermissionIdRequest.cs new file mode 100644 index 00000000..b507e53c --- /dev/null +++ b/Src/Dlhis.Basic.Api/Request/GeneratePermissionIdRequest.cs @@ -0,0 +1,7 @@ +namespace Dlhis.Basic.Api.Request +{ + public class GeneratePermissionIdRequest + { + public long Id { get; set; } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index b90bece8..77b58379 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -32,6 +32,16 @@ public class DevicePermissionsController : ControllerBase await _devicePermissionService.AssignAsync(request); } + [AllowAnonymous] + [HttpPost("assignment-generate")] + [Transactional] + [IgnoreTenant] + public async Task GeneratePermissionsAsync(GeneratePermissionIdRequest request) + { + await _devicePermissionService.GeneratePermissionsAsync(request.Id); + } + + /// /// 当前类型的权限分配 /// @@ -81,4 +91,4 @@ public class DevicePermissionsController : ControllerBase { return await _devicePermissionService.ReGeneratePermissionUsersInfoAsync(beforeDto); } -} +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Request/GeneratePermissionIdRequest.cs b/Src/Dlhis.Basic/Device/Request/GeneratePermissionIdRequest.cs new file mode 100644 index 00000000..df040d36 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Request/GeneratePermissionIdRequest.cs @@ -0,0 +1,7 @@ +namespace Dlhis.Basic.Device.Request +{ + public class GeneratePermissionIdRequest + { + public long Id { get; set; } + } +} \ 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 48d44400..39fe6948 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -10,9 +10,12 @@ public interface IDevicePermissionService : IScopeDependency /// /// 保存设备权限 /// - /// + /// /// - Task AssignAsync(DevicePermissionSaveRequest reuqest); + Task AssignAsync(DevicePermissionSaveRequest request); + + + Task GeneratePermissionsAsync(long id); /// /// 获取分配的权限 diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 3de9856d..6a3dc22c 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -5,11 +5,14 @@ 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.Entity; 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; @@ -17,44 +20,85 @@ 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) + public DevicePermissionService(IDbContext dbContext, ICurrentUser currentUser, RedisCache redisCache, IHangfireApi hangfireApi) { _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(); + request.TenantId = tenantId; - await GenerateDeviceTasksAsync(async () => + var json = request.ToJson(); + var id = await _dbContext.InsertReturnIdentityAsync(new DevicePermissionAssignmentEntity { - //删除当前匹配的基地权限 - var p = await _dbContext.Queryable() - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.AssignValue == request.AssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .Where(x => x.TenantId == tenantId) - .ToListAsync(); + Assignment = json, + IsHandler = false, + Result = null, + TenantId = currentTenantId + }); - await _dbContext.DeleteReallyAsync(p); + await _hangfireApi.GeneratePermissionsAsync(new GeneratePermissionIdRequest() + { + Id = id + }); + } - //保存配置的权限 - if (request.Codes.IsPresent()) + public async Task GeneratePermissionsAsync(long id) + { + var assignment = await _dbContext.Queryable().SingleAsync(x => x.Id == id); + if (assignment == null) return; + if (assignment.IsHandler) return; + + try + { + var request = assignment.Assignment.ToObject(); + + await GenerateDeviceTasksAsync(async () => { - var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity - { - AssignType = request.AssignType, - AssignValue = request.AssignValue, - UniqueType = request.UniqueType, - UniqueValue = code, - TenantId = tenantId - }).ToList(); + //删除当前匹配的基地权限 + var p = await _dbContext.Queryable() + .Where(x => x.AssignType == request.AssignType) + .Where(x => x.AssignValue == request.AssignValue) + .Where(x => x.UniqueType == request.UniqueType) + .Where(x => x.TenantId == request.TenantId) + .ToListAsync(); - await _dbContext.InsertAsync(devicePermissions); - } - }, null); + await _dbContext.DeleteReallyAsync(p); + + //保存配置的权限 + if (request.Codes.IsPresent()) + { + var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity + { + AssignType = request.AssignType, + AssignValue = request.AssignValue, + UniqueType = request.UniqueType, + UniqueValue = code, + TenantId = request.TenantId + }).ToList(); + + await _dbContext.InsertAsync(devicePermissions); + } + }, null); + } + finally + { + assignment.IsHandler = true; + await _dbContext.UpdateAsync(assignment); + } } public async Task> GetAssignmentsAsync(DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) diff --git a/Src/Dlhis.Basic/Packs/SqlSugarPack.cs b/Src/Dlhis.Basic/Packs/SqlSugarPack.cs index 5d87d2d9..ec794301 100644 --- a/Src/Dlhis.Basic/Packs/SqlSugarPack.cs +++ b/Src/Dlhis.Basic/Packs/SqlSugarPack.cs @@ -54,20 +54,22 @@ public class SqlSugarPack : BaseAppPack public override void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var isGenerate = Configuration.GetSection("SqlSugarOptions").GetValue("Generate"); - if (isGenerate) + if (!isGenerate) { - using var scope = app.ApplicationServices.CreateScope(); - var db = scope.ServiceProvider.GetService(); - // var tables = App.ActiveTyps.Where(x => x.IsDefined(typeof(SugarTable), false)) - // .Where(x => !x.IsDefined(typeof(SkipScanAttribute), false)) - // .ToArray(); - // - // db.Client.DbMaintenance.CreateDatabase(); - // db.Client.CodeFirst.InitTables(tables); - // - // var faceDb = db.ChangeDb("face"); - // faceDb.Client.DbMaintenance.CreateDatabase(); - // faceDb.Client.CodeFirst.InitTables(); + return; } + + using var scope = app.ApplicationServices.CreateScope(); + var db = scope.ServiceProvider.GetService(); + var tables = App.ActiveTypes.Where(x => x.IsDefined(typeof(SugarTable), false)) + .Where(x => !x.IsDefined(typeof(SkipScanAttribute), false)) + .ToArray(); + + db.Client.DbMaintenance.CreateDatabase(); + db.Client.CodeFirst.InitTables(tables); + + var faceDb = db.ChangeDb("face"); + faceDb.Client.DbMaintenance.CreateDatabase(); + faceDb.Client.CodeFirst.InitTables(); } } \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/DevicePermissionEntity.cs b/Src/Dlhis.Entity/Basic/Entity/DevicePermissionEntity.cs new file mode 100644 index 00000000..7403ff02 --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/DevicePermissionEntity.cs @@ -0,0 +1,32 @@ +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 设备权限分配 +/// +[SugarTable(TableName = "DevicePermissionAssignment", TableDescription = "设备权限分配")] +public class DevicePermissionAssignmentEntity : SugarBaseEntity, ITenantId +{ + /// + /// 分配json + /// + [SugarColumn(IsNullable = false, ColumnDataType = "varchar(1000)", ColumnDescription = "分配json")] + public string Assignment { get; set; } + + /// + /// 是否处理 + /// + [SugarColumn(ColumnDataType = "bit(1)", ColumnDescription = "是否处理")] + public bool IsHandler { get; set; } + + /// + /// 处理结果 + /// + [SugarColumn(ColumnDescription = "处理结果")] + public string Result { get; set; } + + public string TenantId { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Scheduled.Api/IHangfireApi.cs b/Src/Dlhis.Scheduled.Api/IHangfireApi.cs index 6b16e37d..7cac8284 100644 --- a/Src/Dlhis.Scheduled.Api/IHangfireApi.cs +++ b/Src/Dlhis.Scheduled.Api/IHangfireApi.cs @@ -4,6 +4,7 @@ using Kurisu.RemoteCall.Default; namespace Dlhis.Scheduled.Api; +[RequestLog] [EnableRemoteClient(Name = "hangfire-service", BaseUrl = "${InternalRequest:ScheduledRequestUrl}")] public interface IHangfireApi { @@ -14,4 +15,8 @@ public interface IHangfireApi /// [Post("api/hangfire/sap/person/no")] Task SyncSapPersonAsync(SapNoRequest request); -} + + [Auth] + [Post("api/hangfire/assignment-generate")] + Task GeneratePermissionsAsync(GeneratePermissionIdRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Scheduled.Api/Request/GeneratePermissionIdRequest.cs b/Src/Dlhis.Scheduled.Api/Request/GeneratePermissionIdRequest.cs new file mode 100644 index 00000000..4c76de9d --- /dev/null +++ b/Src/Dlhis.Scheduled.Api/Request/GeneratePermissionIdRequest.cs @@ -0,0 +1,7 @@ +namespace Dlhis.Scheduled.Api.Request +{ + public class GeneratePermissionIdRequest + { + public long Id { get; set; } + } +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/Common/Services/IHangfireService.cs b/Src/Dlhis.ScheduledTask/Common/Services/IHangfireService.cs index 688cd218..c90a87a5 100644 --- a/Src/Dlhis.ScheduledTask/Common/Services/IHangfireService.cs +++ b/Src/Dlhis.ScheduledTask/Common/Services/IHangfireService.cs @@ -1,4 +1,5 @@ -using Dlhis.ScheduledTask.Common.Request; +using Dlhis.Basic.Api.Request; +using Dlhis.ScheduledTask.Common.Request; namespace Dlhis.ScheduledTask.Common.Services; @@ -20,4 +21,7 @@ public interface IHangfireService : IScopeDependency /// /// Task CreateSapWerkSyncBackgroundJobAsync(SapNoRequest request); -} + + + void GeneratePermissions(GeneratePermissionIdRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/Common/Services/Implements/HangfireService.cs b/Src/Dlhis.ScheduledTask/Common/Services/Implements/HangfireService.cs index 3d07c02c..7508f760 100644 --- a/Src/Dlhis.ScheduledTask/Common/Services/Implements/HangfireService.cs +++ b/Src/Dlhis.ScheduledTask/Common/Services/Implements/HangfireService.cs @@ -1,4 +1,6 @@ -using Dlhis.Entity.Basic.Entity; +using Dlhis.Basic.Api; +using Dlhis.Basic.Api.Request; +using Dlhis.Entity.Basic.Entity; using Dlhis.ScheduledTask.Common.Request; using Hangfire; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; @@ -33,7 +35,7 @@ public class HangfireService : IHangfireService { var jobKey = $"hangfire:background:werk:{request.Code}"; - using var handler = await _redisCache.LockAsync(jobKey); + await using var handler = await _redisCache.LockAsync(jobKey); if (handler.Acquired) { var werkInfo = await _dbContext.Queryable().Where(x => x.Werk == request.Code).SingleAsync(); @@ -44,4 +46,10 @@ public class HangfireService : IHangfireService BackgroundJob.Enqueue(x => x.TodoByWerkAsync(request.Code)); } } -} + + /// + public void GeneratePermissions(GeneratePermissionIdRequest request) + { + BackgroundJob.Enqueue(x => x.GeneratePermissionsAsync(request)); + } +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs index fad7d5cd..22b92c7e 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs @@ -1,4 +1,6 @@ -using Dlhis.ScheduledTask.Common.Request; +using Dlhis.Basic.Api; +using Dlhis.Basic.Api.Request; +using Dlhis.ScheduledTask.Common.Request; using Dlhis.ScheduledTask.Common.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -42,4 +44,11 @@ public class HangfireController : ControllerBase { await _hangfireService.CreateSapWerkSyncBackgroundJobAsync(request); } -} + + + [HttpPost("assignment-generate")] + public void GeneratePermissionsAsync(GeneratePermissionIdRequest request) + { + _hangfireService.GeneratePermissions(request); + } +} \ No newline at end of file