diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index c3b91f89..7dbd4ca9 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -66,6 +66,16 @@ public class DevicePermissionService : IDevicePermissionService return await AssignDeviceGroupToTenantAsync(currentTenantId, request); } + if (request.AssignType == AssignTypeEnumType.Department && request.UniqueType == DeviceAssignmentTypeEnumType.Device) + { + return await AssignDeviceToDepartmentAsync(currentTenantId, isAll, deviceCodes, request); + } + + if (request.AssignType == AssignTypeEnumType.Department && request.UniqueType == DeviceAssignmentTypeEnumType.Group) + { + return await AssignDeviceGroupToDepartmentAsync(currentTenantId, request); + } + _parallelService.Enable = true; return await GenerateDeviceTasksAsync(async () => { @@ -104,6 +114,212 @@ public class DevicePermissionService : IDevicePermissionService }, null); } + public async Task AssignDeviceToDepartmentAsync(string currentTenantId, bool isAll, List deviceCodes, DevicePermissionSaveRequest request) + { + request.AssignValue = request.TenantId + ":" + request.AssignValue; + + var p = await _dbContext.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => x.AssignValue == request.AssignValue) + .Where(x => x.UniqueType == request.UniqueType) + .WhereIF(!isAll, x => deviceCodes.Contains(x.UniqueValue)) + .Where(x => x.Type == request.Type) + .Where(x => x.TenantId == currentTenantId) + .ToListAsync(); + + var departments = await _dbContext.Queryable().ToListAsync(); + var departmentNos = new List { request.AssignValue }; + DepartmentRecursionGetNext(request.AssignValue, departments, departmentNos); + + var gainfoNos = await _dbContext.Queryable() + .Where(x => x.Factory == request.TenantId && departmentNos.Contains(x.DepartmentNo)) + .Select(x => x.No) + .ToListAsync(); + + var beforeDeviceCodes = p.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(); + + await _dbContext.DeleteAsync(p); + //保存配置的权限 + if (request.Codes.IsPresent()) + { + var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity + { + AssignType = request.AssignType, + AssignValue = request.AssignValue, + UniqueType = request.UniqueType, + UniqueValue = code, + Type = request.Type, + TenantId = currentTenantId + }).ToList(); + + 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 tasks = new List(); + foreach (var gainfoNo in gainfoNos) + { + tasks.AddRange(addDeviceCodes.Select(x => + { + 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, + }; + }).ToList()); + + tasks.AddRange(deleteDeviceCodes.Select(x => + { + 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, + }; + }).ToList()); + } + + 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 + }; + } + + + public async Task AssignDeviceGroupToDepartmentAsync(string currentTenantId, DevicePermissionSaveRequest request) + { + request.AssignValue = request.TenantId + ":" + request.AssignValue; + + var groupData = await _dbContext.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => x.AssignValue == request.AssignValue) + .Where(x => x.UniqueType == request.UniqueType) + .Where(x => x.Type == request.Type) + .Where(x => x.TenantId == currentTenantId) + .ToListAsync(); + + var departments = await _dbContext.Queryable().ToListAsync(); + var departmentNos = new List { request.AssignValue }; + DepartmentRecursionGetNext(request.AssignValue, departments, departmentNos); + + var gainfoNos = await _dbContext.Queryable() + .Where(x => x.Factory == request.TenantId && departmentNos.Contains(x.DepartmentNo)) + .Select(x => x.No) + .ToListAsync(); + + var beforeDeviceCodes = groupData.Select(x => x.UniqueValue).ToList(); + var presentDeviceCodes = request.Codes.IsPresent() ? request.Codes : new List(); + + var addDeviceGroupCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); + var deleteDeviceGroupCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); + + await _dbContext.DeleteAsync(groupData); + //保存配置的权限 + if (request.Codes.IsPresent()) + { + var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity + { + AssignType = request.AssignType, + AssignValue = request.AssignValue, + UniqueType = request.UniqueType, + UniqueValue = code, + Type = request.Type, + TenantId = currentTenantId + }).ToList(); + + await _dbContext.InsertAsync(devicePermissions); + } + + 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(addDevices.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()); + + tasks.AddRange(deleteDevices.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()); + } + + foreach (var items in tasks.Chunk(500)) + { + await _dbContext.InsertAsync(items.ToList()); + } + + return new DevicePermissionAssignResponse + { + AddCount = addDevices.Count * gainfoNos.Count, + DeleteCount = deleteDevices.Count * gainfoNos.Count + }; + } + + private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request) { if (request.UniqueType == DeviceAssignmentTypeEnumType.Group)