diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 3e849981..33aba5f8 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -20,12 +20,14 @@ public class DevicePermissionService : IDevicePermissionService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; + private readonly ILogger _logger; public DevicePermissionService(IDbContext dbContext, - ICurrentUser currentUser) + ICurrentUser currentUser, ILogger logger) { _dbContext = dbContext; _currentUser = currentUser; + _logger = logger; } public async Task AssignAsync(DevicePermissionSaveRequest request) @@ -252,95 +254,91 @@ public class DevicePermissionService : IDevicePermissionService public async Task GenerateDeviceTasksAsync(Func func, List userNos) { + //获取所有人的权限 + if (userNos.IsEmpty()) + userNos = await GetPermissionUserNosAsync(); + + var before = await GetAssignDeviceCodesInternalAsync(userNos); + + //业务处理 + _dbContext.Client.QueryFilter.Restore(); + await func(); _dbContext.Client.QueryFilter.ClearAndBackup(); - try + + //获取业务处理后所有人的权限 + 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 waitTasks = new List(); + + foreach (var userNo in userNos) { - //获取所有人的权限 - if (userNos.IsEmpty()) - userNos = await GetPermissionUserNosAsync(); + before.TryGetValue(userNo, out var beforeTenantDeviceCodes); + beforeTenantDeviceCodes ??= new(); + current.TryGetValue(userNo, out var currentTenantDeviceCodes); + currentTenantDeviceCodes ??= new(); - var before = await GetAssignDeviceCodesInternalAsync(userNos); + var tenants = new HashSet(); + foreach (var item in beforeTenantDeviceCodes) + tenants.Add(item.Tenant); + foreach (var item in currentTenantDeviceCodes) + tenants.Add(item.Tenant); - _dbContext.Client.QueryFilter.Restore(); - //业务处理 - await func(); - _dbContext.Client.QueryFilter.ClearAndBackup(); - - //获取业务处理后所有人的权限 - 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 waitTasks = new List(); - - foreach (var userNo in userNos) + foreach (var tenant in tenants) { - before.TryGetValue(userNo, out var beforeTenantDeviceCodes); - beforeTenantDeviceCodes ??= new(); + var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new(); + var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new(); - current.TryGetValue(userNo, out var currentTenantDeviceCodes); - currentTenantDeviceCodes ??= new(); + //被删除 + var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList(); + //新增 + var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList(); - var tenants = beforeTenantDeviceCodes.Select(x => x.Tenant).Concat(currentTenantDeviceCodes.Select(x => x.Tenant)).Distinct().ToList(); - - foreach (var tenant in tenants) + if (!deletedItems.Any() && !addItems.Any()) { - var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new(); - var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new(); - - //被删除 - 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(); - - //下发任务创建 - var toDeleted = deletedItems.Select(x => 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, - }).ToList(); - - var toAdd = addItems.Select(x => 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, - }).ToList(); - - waitTasks.AddRange(toDeleted.Concat(toAdd).ToList()); + continue; } - } - if (waitTasks.Any()) - { - await _dbContext.InsertAsync(waitTasks); + 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(); + + //下发任务创建 + var toDeleted = deletedItems.Select(x => 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, + }).ToList(); + + var toAdd = addItems.Select(x => 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, + }).ToList(); + + waitTasks.AddRange(toDeleted.Concat(toAdd).ToList()); } } - finally + + _logger.LogInformation("任务产生数量{count}", waitTasks.Count); + if (waitTasks.Any()) { - _dbContext.Client.QueryFilter.Restore(); + await _dbContext.InsertAsync(waitTasks); } }