fix 无差异数据持久化

This commit is contained in:
2024-12-11 16:12:33 +08:00
parent 0aa476bcf3
commit 41be03fb12

View File

@@ -35,74 +35,82 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService
public async Task<DevicePermissionAssignResponse> AnalyzeAsync(DevicePermissionSaveRequest request) public async Task<DevicePermissionAssignResponse> AnalyzeAsync(DevicePermissionSaveRequest request)
{ {
var tasksToAdd = new List<DeviceTaskEntity>();
var tasksToDelete = new List<DeviceTaskEntity>();
await CheckWhetherAssignToTopDeviceGroupAsync(request); await CheckWhetherAssignToTopDeviceGroupAsync(request);
await CheckAssignedToTenantAsync(request); await CheckAssignedToTenantAsync(request);
var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request); var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request);
(List<Guid> codesToAdd, List<Guid> codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes); try
if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty())
{ {
return new DevicePermissionAssignResponse(0, 0); (List<Guid> codesToAdd, List<Guid> codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes);
} if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty())
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())
{ {
var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); return new DevicePermissionAssignResponse(0, 0);
var actToDeleteCodes = codesToDelete.Except(myDeviceCodes);
currentDevicesToDelete = devicesToDelete.Where(p => actToDeleteCodes.Contains(p.Code));
} }
tasksToAdd.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity 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();
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 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, IEnumerable<DeviceEntity> currentDevicesToDelete = devicesToDelete;
DeviceType = x.Type, if (userTenantDeviceCodes.Any())
UserId = null, {
UserNo = gainfoNo, var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes);
DeviceUniqueNo = x.UniqueNo, var actToDeleteCodes = codesToDelete.Except(myDeviceCodes);
Status = DeviceTaskStatusEnumType.Wait, currentDevicesToDelete = devicesToDelete.Where(p => actToDeleteCodes.Contains(p.Code));
Version = 0, }
ResultMessage = null,
CancellationId = 0, tasksToAdd.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity
Source = DeviceTaskSourceEnumType.Manually, {
Priority = 0, Type = DeviceTaskEnumType.Add,
TenantId = x.TenantId, DeviceType = x.Type,
}).ToList()); 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); return new DevicePermissionAssignResponse(tasksToAdd.Count, tasksToDelete.Count);
} }