fix 优化下发创建

This commit is contained in:
2024-01-18 19:00:05 +08:00
parent bf64647d71
commit ce8f64fee3

View File

@@ -87,28 +87,22 @@ public class DevicePermissionService : IDevicePermissionService
userNos = await GetPermissionUserNosAsync();
}
var beforeDic = new Dictionary<string, List<Guid>>(userNos.Count);
foreach (var userNo in userNos)
{
beforeDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo));
}
var beforeDic = await GetAssignDeviceCodesAsync(userNos);
//获取处理
await func();
//获取当前的权限code
var currentDic = new Dictionary<string, List<Guid>>(userNos.Count);
var nextUserNos = await GetPermissionUserNosAsync();
if (nextUserNos.Any())
{
userNos = nextUserNos;
}
foreach (var userNo in userNos)
{
currentDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo));
}
var currentDic = await GetAssignDeviceCodesAsync(userNos);
var deivces = await _dbContext.Queryable<DeviceEntity>().ToListAsync();
foreach (var userNo in userNos)
{
beforeDic.TryGetValue(userNo, out var beforeCodes);
@@ -127,8 +121,7 @@ public class DevicePermissionService : IDevicePermissionService
continue;
}
var deivces = await _dbContext.Queryable<DeviceEntity>().Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).ToListAsync();
var deviceCodes = deivces.Select(x => x.Code).ToList();
var deviceCodes = deivces.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();
@@ -244,6 +237,91 @@ public class DevicePermissionService : IDevicePermissionService
return deviceCodes.Distinct().ToList();
}
private async Task<Dictionary<string, List<Guid>>> GetAssignDeviceCodesAsync(List<string> userNos)
{
var gainfos = await _dbContext.Queryable<GainfoEntity>().Where(x => userNos.Contains(x.No)).ToListAsync();
if (!gainfos.Any())
{
return new Dictionary<string, List<Guid>>();
}
var gainfoGroupRelationships = await _dbContext.Queryable<GainfoGroupRelationshipEntity>().ToListAsync();
var devicePermissions = await _dbContext.Queryable<DevicePermissionEntity>().ToListAsync();
var deviceGroups = await _dbContext.Queryable<DeviceGroupEntity>().ToListAsync();
var result = new Dictionary<string, List<Guid>>();
foreach (var gainfo in gainfos)
{
var userNo = gainfo.No;
var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).ToList();
var deviceCodes = new List<Guid>();
var deviceGroupCodes = new List<Guid>();
var du = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo);
var gu = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo);
deviceCodes.AddRange(du);
deviceGroupCodes.AddRange(gu);
foreach (var group in gainfoGroups)
{
var dg = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, group.ToString());
var gg = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, group.ToString());
deviceCodes.AddRange(dg);
deviceGroupCodes.AddRange(gg);
}
var dd = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, gainfo.DepartmentNo);
var gd = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, gainfo.DepartmentNo);
deviceCodes.AddRange(dd);
deviceGroupCodes.AddRange(gd);
var dt = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Werks);
var gt = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Werks);
deviceCodes.AddRange(du);
deviceGroupCodes.AddRange(gu);
var deveiceCodesByGroup = await _dbContext.Queryable<DeviceGroupRelationshipEntity>().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToListAsync();
deviceCodes.AddRange(deveiceCodesByGroup);
result.Add(userNo, deviceCodes.Distinct().ToList());
}
return result;
List<Guid> GetAssignmentsInternal(DeviceAssignmentTypeEnumType uniqueTypeInternal, AssignTypeEnumType assignTypeInternal, string assignValueInternal)
{
var devicePermissionsInternal = devicePermissions.Where(x => x.UniqueType == uniqueTypeInternal)
.Where(x => x.AssignType == assignTypeInternal)
.Where(x => x.AssignValue == assignValueInternal)
.Select(x => x.UniqueValue)
.ToList();
if (uniqueTypeInternal == DeviceAssignmentTypeEnumType.Group)
{
var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList();
tops.ForEach(x =>
{
RecursionGetNext(x, deviceGroups, devicePermissionsInternal, devicePermissionsInternal.Contains(x.Code));
});
}
return devicePermissionsInternal.Distinct().ToList();
void RecursionGetNext(DeviceGroupEntity current, List<DeviceGroupEntity> deviceGroups, List<Guid> result, bool add)
{
var next = deviceGroups.Where(x => x.PCode == current.Code).ToList();
foreach (var item in next)
{
if (add) result.Add(item.Code);
RecursionGetNext(item, deviceGroups, result, result.Contains(item.Code));
}
}
}
}
//************************************************ help methods *******************************************************