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); }