From 41be03fb1230155a381430575d92e199a2b8606c Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 16:12:33 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E6=97=A0=E5=B7=AE=E5=BC=82=E6=95=B0?= =?UTF-8?q?=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); }