fix 无差异数据持久化
This commit is contained in:
@@ -35,74 +35,82 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService
|
||||
|
||||
public async Task<DevicePermissionAssignResponse> AnalyzeAsync(DevicePermissionSaveRequest request)
|
||||
{
|
||||
var tasksToAdd = new List<DeviceTaskEntity>();
|
||||
var tasksToDelete = new List<DeviceTaskEntity>();
|
||||
|
||||
await CheckWhetherAssignToTopDeviceGroupAsync(request);
|
||||
await CheckAssignedToTenantAsync(request);
|
||||
|
||||
var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request);
|
||||
|
||||
(List<Guid> codesToAdd, List<Guid> codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes);
|
||||
if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty())
|
||||
try
|
||||
{
|
||||
return new DevicePermissionAssignResponse(0, 0);
|
||||
}
|
||||
|
||||
var devicesToAdd = await DbContext.Queryable<DeviceEntity>().Where(x => codesToAdd.Contains(x.Code)).Distinct().ToListAsync();
|
||||
var devicesToDelete = await DbContext.Queryable<DeviceEntity>().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<string, IEnumerable<TenantAssignTypeDeviceCode>>();
|
||||
|
||||
var tasksToAdd = new List<DeviceTaskEntity>();
|
||||
var tasksToDelete = new List<DeviceTaskEntity>();
|
||||
foreach (var gainfoNo in gainfoNos)
|
||||
{
|
||||
IEnumerable<DeviceEntity> currentDevicesToDelete = devicesToDelete;
|
||||
if (userTenantDeviceCodes.Any())
|
||||
(List<Guid> codesToAdd, List<Guid> 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<DeviceEntity>().Where(x => codesToAdd.Contains(x.Code)).Distinct().ToListAsync();
|
||||
var devicesToDelete = await DbContext.Queryable<DeviceEntity>().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<string, IEnumerable<TenantAssignTypeDeviceCode>>();
|
||||
|
||||
|
||||
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<DeviceEntity> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user