diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index da3baf4e..c3b91f89 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -32,21 +32,18 @@ public class DevicePermissionService : IDevicePermissionService private readonly IMyDataPermissionService _myDataPermissionService; private readonly ITenantApi _tenantApi; private readonly IParallelService _parallelService; - private readonly ILogger _logger; private readonly ICurrentUser _currentUser; public DevicePermissionService(IDbContext dbContext, IMyDataPermissionService myDataPermissionService, ITenantApi tenantApi, IParallelService parallelService, - ILogger logger, ICurrentUser currentUser) { _dbContext = dbContext; _myDataPermissionService = myDataPermissionService; _tenantApi = tenantApi; _parallelService = parallelService; - _logger = logger; _currentUser = currentUser; } @@ -64,10 +61,10 @@ public class DevicePermissionService : IDevicePermissionService return await AssignDeviceToTenantAsync(currentTenantId, isAll, deviceCodes, request); } - // if (request.AssignType == AssignTypeEnumType.Tenant && request.UniqueType == DeviceAssignmentTypeEnumType.Group) - // { - // return await AssignDeviceGroupToTenantAsync(currentTenantId, request); - // } + if (request.AssignType == AssignTypeEnumType.Tenant && request.UniqueType == DeviceAssignmentTypeEnumType.Group) + { + return await AssignDeviceGroupToTenantAsync(currentTenantId, request); + } _parallelService.Enable = true; return await GenerateDeviceTasksAsync(async () => @@ -210,7 +207,11 @@ public class DevicePermissionService : IDevicePermissionService }).ToList()); } - await _dbContext.InsertAsync(tasks); + foreach (var items in tasks.Chunk(500)) + { + await _dbContext.InsertAsync(items.ToList()); + } + return new DevicePermissionAssignResponse { AddCount = addDeviceCodes.Count * gainfoNos.Count, @@ -234,8 +235,8 @@ public class DevicePermissionService : IDevicePermissionService var beforeDeviceCodes = groupData.Select(x => x.UniqueValue).ToList(); var presentDeviceCodes = request.Codes.IsPresent() ? request.Codes : new List(); - var addDeviceCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); - var deleteDeviceCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); + var addDeviceGroupCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); + var deleteDeviceGroupCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); await _dbContext.DeleteAsync(groupData); //保存配置的权限 @@ -254,64 +255,88 @@ public class DevicePermissionService : IDevicePermissionService await _dbContext.InsertAsync(devicePermissions); } - var allDeviceCodes = addDeviceCodes.Concat(deleteDeviceCodes).ToList(); - var devices = await _dbContext.Queryable() - .Where(x => allDeviceCodes.Contains(x.Code)) - .Select(x => new { x.Code, x.UniqueNo, x.Type, x.TenantId }) - .ToListAsync(); + var deviceGroups = await _dbContext.Queryable().ToListAsync(); + + var addDevices = await GetDevicesByGroupsAsync(deviceGroups, deviceGroups.Where(x => addDeviceGroupCodes.Contains(x.Code)).ToList()); + var deleteDevices = await GetDevicesByGroupsAsync(deviceGroups, deviceGroups.Where(x => deleteDeviceGroupCodes.Contains(x.Code)).ToList()); var tasks = new List(); foreach (var gainfoNo in gainfoNos) { - tasks.AddRange(addDeviceCodes.Select(x => + tasks.AddRange(addDevices.Select(x => new DeviceTaskEntity { - var d = devices.First(item => item.Code == x); - return new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Add, - DeviceType = d.Type, - UserId = null, - UserNo = gainfoNo, - DeviceUniqueNo = d.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = d.TenantId, - }; + 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()); - tasks.AddRange(deleteDeviceCodes.Select(x => + tasks.AddRange(deleteDevices.Select(x => new DeviceTaskEntity { - var d = devices.First(item => item.Code == x); - return new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Delete, - DeviceType = d.Type, - UserId = null, - UserNo = gainfoNo, - DeviceUniqueNo = d.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - CancellationId = 0, - Source = DeviceTaskSourceEnumType.Manually, - Priority = 0, - TenantId = d.TenantId, - }; + 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 _dbContext.InsertAsync(tasks); + foreach (var items in tasks.Chunk(500)) + { + await _dbContext.InsertAsync(items.ToList()); + } + return new DevicePermissionAssignResponse { - AddCount = addDeviceCodes.Count * gainfoNos.Count, - DeleteCount = deleteDeviceCodes.Count * gainfoNos.Count + AddCount = addDevices.Count * gainfoNos.Count, + DeleteCount = deleteDevices.Count * gainfoNos.Count }; } + private static void RecursionGetNextDeviceGroup(List allData, DeviceGroupEntity current, List result) + { + var nextItems = allData.Where(x => x.PCode == current.Code).ToList(); + foreach (var item in nextItems) + { + result.Add(item.Code); + RecursionGetNextDeviceGroup(allData, item, result); + } + } + + private async Task> GetDevicesByGroupsAsync(List allData, List groups) + { + var result = new List(); + foreach (var group in groups) + { + result.Add(group.Code); + RecursionGetNextDeviceGroup(allData, group, result); + } + + var deviceCodes = await _dbContext.Queryable() + .Where(x => result.Contains(x.GroupCode)) + .Select(x => x.DeviceCode) + .ToListAsync(); + + return await _dbContext.Queryable() + .Where(x => deviceCodes.Contains(x.Code)) + .ToListAsync(); + } + public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) { var currentTenantId = _currentUser.GetStringTenantId(); @@ -375,7 +400,7 @@ public class DevicePermissionService : IDevicePermissionService CancellationId = 0, Source = DeviceTaskSourceEnumType.Manually, Priority = 0, - TenantId = device.TenantId, + TenantId = currentTenantId, }).ToList()); await _dbContext.InsertAsync(deletes.Select(x => new DeviceTaskEntity @@ -391,7 +416,7 @@ public class DevicePermissionService : IDevicePermissionService CancellationId = 0, Source = DeviceTaskSourceEnumType.Manually, Priority = 0, - TenantId = device.TenantId, + TenantId = currentTenantId }).ToList()); // await GenerateDeviceTasksAsync(async () => @@ -953,7 +978,7 @@ public class DevicePermissionService : IDevicePermissionService List devicePermissions, List deviceGroups, List departments, DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) { - var tenantDevicePermissions = devicePermissions.AsParallel() + var tenantDevicePermissions = devicePermissions .Where(x => x.UniqueType == uniqueType && x.AssignType == assignType && x.AssignValue == assignValue) @@ -980,7 +1005,7 @@ public class DevicePermissionService : IDevicePermissionService departmentNos = departmentNos.Select(x => tenantId + ":" + x).ToList(); - tenantDevicePermissions = devicePermissions.AsParallel() + tenantDevicePermissions = devicePermissions .Where(x => x.UniqueType == uniqueType) .Where(x => x.AssignType == assignType) .Where(x => departmentNos.Contains(x.AssignValue)) @@ -1032,8 +1057,6 @@ public class DevicePermissionService : IDevicePermissionService private async Task>> GetAssignDeviceCodesInternalAsync(List userNos) { - var sw = Stopwatch.StartNew(); - var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList(); var registries = await _dbContext.Queryable() @@ -1055,64 +1078,54 @@ public class DevicePermissionService : IDevicePermissionService var deviceRelationships = await _dbContext.Queryable().ToListAsync(); var departments = await _dbContext.Queryable().ToListAsync(); - _logger.LogWarning("获取数据时间:{ts}", sw.ElapsedMilliseconds); - sw.Restart(); - - try + if (_parallelService.Enable) { - if (_parallelService.Enable) + var result = new ConcurrentDictionary>(); + + Parallel.ForEach(gainfos, new ParallelOptions { MaxDegreeOfParallelism = 4 }, gainfo => { - var result = new ConcurrentDictionary>(); - - Parallel.ForEach(gainfos, new ParallelOptions { MaxDegreeOfParallelism = 4 }, gainfo => + var gainfoDto = new GainfoDto { - var gainfoDto = new GainfoDto - { - Id = gainfo.Id, - No = gainfo.No, - Code = gainfo.Code, - Name = gainfo.Name, - Workplace = gainfo.Workplace, - Factory = gainfo.Factory, - DepartmentNo = gainfo.DepartmentNo, - IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, - EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true - }; + Id = gainfo.Id, + No = gainfo.No, + Code = gainfo.Code, + Name = gainfo.Name, + Workplace = gainfo.Workplace, + Factory = gainfo.Factory, + DepartmentNo = gainfo.DepartmentNo, + IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, + EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true + }; - var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); - result.TryAdd(gainfo.No, codes); - }); + var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); + result.TryAdd(gainfo.No, codes); + }); - return result.ToDictionary(x => x.Key, x => x.Value); - } - else - { - var result = new Dictionary>(); - foreach (var gainfo in gainfos) - { - var gainfoDto = new GainfoDto - { - Id = gainfo.Id, - No = gainfo.No, - Code = gainfo.Code, - Name = gainfo.Name, - Workplace = gainfo.Workplace, - Factory = gainfo.Factory, - DepartmentNo = gainfo.DepartmentNo, - IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, - EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true - }; - - var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); - result.Add(gainfo.No, codes); - } - - return result; - } + return result.ToDictionary(x => x.Key, x => x.Value); } - finally + else { - _logger.LogWarning("权限获取时间:{ts}", sw.ElapsedMilliseconds); + var result = new Dictionary>(); + foreach (var gainfo in gainfos) + { + var gainfoDto = new GainfoDto + { + Id = gainfo.Id, + No = gainfo.No, + Code = gainfo.Code, + Name = gainfo.Name, + Workplace = gainfo.Workplace, + Factory = gainfo.Factory, + DepartmentNo = gainfo.DepartmentNo, + IsOutsource = gainfo.Type == GainfoUserTypeEnumType.Outsource, + EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true + }; + + var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); + result.Add(gainfo.No, codes); + } + + return result; } } @@ -1126,7 +1139,6 @@ public class DevicePermissionService : IDevicePermissionService List deviceRegistries, List devices, List departments) { - var sw = Stopwatch.StartNew(); if (gainfo.IsOutsource) { //外包人员不允许餐饮 @@ -1150,8 +1162,6 @@ public class DevicePermissionService : IDevicePermissionService deviceGroupDtos.AddRange(gu); businessPlaceDtos.AddRange(pu); - _logger.LogWarning("按用户获取时间:{ts}", sw.ElapsedMilliseconds); - sw.Restart(); //按用户组 foreach (var groupCode in gainfoGroups) { @@ -1163,9 +1173,6 @@ public class DevicePermissionService : IDevicePermissionService businessPlaceDtos.AddRange(pg); } - _logger.LogWarning("按用户组获取时间:{ts}", sw.ElapsedMilliseconds); - sw.Restart(); - //按部门 var currentAssignValue = gainfo.Factory + ":" + gainfo.DepartmentNo; var dd = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, currentAssignValue); @@ -1175,9 +1182,6 @@ public class DevicePermissionService : IDevicePermissionService deviceGroupDtos.AddRange(gd); businessPlaceDtos.AddRange(pd); - _logger.LogWarning("按部门获取时间:{ts}", sw.ElapsedMilliseconds); - sw.Restart(); - //按厂区 if (!gainfo.IsOutsource || gainfo.EnableFactoryPermission) { @@ -1189,9 +1193,6 @@ public class DevicePermissionService : IDevicePermissionService businessPlaceDtos.AddRange(pt); } - _logger.LogWarning("按厂区获取时间:{ts}", sw.ElapsedMilliseconds); - sw.Restart(); - var deviceGroupCodes = deviceGroupDtos.SelectMany(x => x.Codes).Distinct().ToList(); var businessPlaceCodes = businessPlaceDtos.SelectMany(x => x.Codes).Distinct().ToList(); @@ -1219,24 +1220,17 @@ public class DevicePermissionService : IDevicePermissionService deviceDtos.AddRange(deviceCodesByGroup); deviceDtos.AddRange(placeGroup); - try + return deviceDtos.GroupBy(x => x.Tenant).Select(x => { - return deviceDtos.GroupBy(x => x.Tenant).Select(x => + var dto = new UserTenantDeviceCodeDto { - var dto = new UserTenantDeviceCodeDto - { - Tenant = x.Key, - Codes = x.SelectMany(item => item.Codes).Distinct().ToList() - }; + Tenant = x.Key, + Codes = x.SelectMany(item => item.Codes).Distinct().ToList() + }; - dto.Codes = dto.Codes.Where(p => devices.Any(item => item.Code == p)).ToList(); + dto.Codes = dto.Codes.Where(p => devices.Any(item => item.Code == p)).ToList(); - return dto; - }).ToList(); - } - finally - { - _logger.LogWarning("数据整合时间:{ts}", sw.ElapsedMilliseconds); - } + return dto; + }).ToList(); } } \ No newline at end of file