From 3c39f39f4b5720cc6d4efe1b81f2bc604661f1e9 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 3 Dec 2024 10:57:35 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Implements/DevicePermissionService.cs | 280 ++++++++++++++---- 1 file changed, 215 insertions(+), 65 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index a778615a..f6a16c8e 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -47,47 +47,145 @@ public class DevicePermissionService : IDevicePermissionService public async Task AssignAsync(DevicePermissionSaveRequest request) { - await CheckAssignTopDoorDeviceGroupAsync(request); + var currentTenantId = _currentUser.GetStringTenantId(); + var role = _currentUser.GetRole(); + var isAll = role is "admin" or "tenant-admin"; + var deviceCodes = _myDataPermissionService.GetMyDeviceCodes(); - return await GenerateDeviceTasksAsync(async () => + if (request.AssignType == AssignTypeEnumType.Tenant && request.UniqueType == DeviceAssignmentTypeEnumType.Device) { - request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; - var currentTenantId = _currentUser.GetStringTenantId(); - var role = _currentUser.GetRole(); - var isAll = role is "admin" or "tenant-admin"; - var deviceCodes = _myDataPermissionService.GetMyDeviceCodes(); + var p = await _dbContext.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => x.AssignValue == request.AssignValue) + .Where(x => x.UniqueType == request.UniqueType) + .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) + .Where(x => x.Type == request.Type) + .Where(x => x.TenantId == currentTenantId) + .ToListAsync(); - await _dbContext.IgnoreAsync(async () => + + var gainfoNos = await _dbContext.Queryable().Where(x => x.Factory == request.AssignValue).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 p = await _dbContext.Queryable() - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.AssignValue == request.AssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Where(x => x.TenantId == currentTenantId) - .ToListAsync(); - - await _dbContext.DeleteAsync(p); - - //保存配置的权限 - if (request.Codes.IsPresent()) + var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity { - 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(); + AssignType = request.AssignType, + AssignValue = request.AssignValue, + UniqueType = request.UniqueType, + UniqueValue = code, + Type = request.Type, + TenantId = currentTenantId + }).ToList(); - await _dbContext.InsertAsync(devicePermissions); - } - }); - }, null); + 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()); + } + + await _dbContext.InsertAsync(tasks); + return new DevicePermissionAssignResponse + { + AddCount = addDeviceCodes.Count * gainfoNos.Count, + DeleteCount = deleteDeviceCodes.Count * gainfoNos.Count + }; + } + else + { + await CheckAssignTopDoorDeviceGroupAsync(request); + + return await GenerateDeviceTasksAsync(async () => + { + request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; + + await _dbContext.IgnoreAsync(async () => + { + //删除当前匹配的基地权限 + var p = await _dbContext.Queryable() + .Where(x => x.AssignType == request.AssignType) + .Where(x => x.AssignValue == request.AssignValue) + .Where(x => x.UniqueType == request.UniqueType) + .WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue)) + .Where(x => x.Type == request.Type) + .Where(x => x.TenantId == currentTenantId) + .ToListAsync(); + + 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); + } + }); + }, null); + } } private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request) @@ -112,6 +210,9 @@ public class DevicePermissionService : IDevicePermissionService var today = DateTime.Today; var factories = _currentUser.GetUserClaim("tenants").Split(",").ToList(); + var device = await _dbContext.Queryable().Where(x => x.Code == request.UniqueValue).SingleAsync(); + device.ThrowIfNull("设备不存在"); + //删除当前匹配的基地权限 var p = await _dbContext.Queryable() .Where(x => x.UniqueType == request.UniqueType) @@ -121,10 +222,11 @@ public class DevicePermissionService : IDevicePermissionService .Where(x => x.TenantId == currentTenantId) .ToListAsync(); - var gainfoNos = p.Select(x => x.AssignValue).ToList(); + var beforeNos = p.Select(x => x.AssignValue).ToList(); + var presentNos = new List(); if (request.Values.IsPresent()) { - var nos = await _dbContext.Client.Queryable() + presentNos = await _dbContext.Client.Queryable() .Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable() .Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today)) .Any() @@ -133,41 +235,89 @@ public class DevicePermissionService : IDevicePermissionService .Select(gainfo => gainfo.No) .ToListAsync(); - gainfoNos = gainfoNos.Concat(nos).Distinct().ToList(); + //gainfoNos = gainfoNos.Concat(nos).Distinct().ToList(); } - await GenerateDeviceTasksAsync(async () => + var adds = presentNos.Except(beforeNos); + var deletes = beforeNos.Except(presentNos); + + await _dbContext.DeleteAsync(p); + var devicePermissions = presentNos.Select(v => new DevicePermissionEntity { - await _dbContext.DeleteAsync(p); + UniqueType = request.UniqueType, + UniqueValue = request.UniqueValue, + AssignType = request.AssignType, + AssignValue = v, + TenantId = currentTenantId, + Type = request.Type + }).ToList(); - //保存配置的权限 - if (request.Values.IsPresent()) - { - var nos = await _dbContext.Client.Queryable() - .Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable() - .Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today)) - .Any() - ) - .Where(gainfo => request.Values.Contains(gainfo.Code) || request.Values.Contains(gainfo.No) || request.Values.Contains(gainfo.IdNo)) - .Select(gainfo => gainfo.No) - .ToListAsync(); + await _dbContext.InsertAsync(devicePermissions); - //todo 临时注释 - //(gainfoNos.Count != request.Values.Count).ThrowIfTrue("存在非当前权限访问的人员,操作禁止!"); + await _dbContext.InsertAsync(adds.Select(x => new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Add, + DeviceType = device.Type, + UserId = null, + UserNo = x, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 0, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = device.TenantId, + }).ToList()); - var devicePermissions = nos.Select(v => new DevicePermissionEntity - { - UniqueType = request.UniqueType, - UniqueValue = request.UniqueValue, - AssignType = request.AssignType, - AssignValue = v, - TenantId = currentTenantId, - Type = request.Type - }).ToList(); + await _dbContext.InsertAsync(deletes.Select(x => new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Delete, + DeviceType = device.Type, + UserId = null, + UserNo = x, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 0, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = device.TenantId, + }).ToList()); - await _dbContext.InsertAsync(devicePermissions); - } - }, gainfoNos); + // await GenerateDeviceTasksAsync(async () => + // { + // await _dbContext.DeleteAsync(p); + // + // //保存配置的权限 + // if (request.Values.IsPresent()) + // { + // var nos = await _dbContext.Client.Queryable() + // .Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable() + // .Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today)) + // .Any() + // ) + // .Where(gainfo => request.Values.Contains(gainfo.Code) || request.Values.Contains(gainfo.No) || request.Values.Contains(gainfo.IdNo)) + // .Select(gainfo => gainfo.No) + // .ToListAsync(); + // + // //todo 临时注释 + // //(gainfoNos.Count != request.Values.Count).ThrowIfTrue("存在非当前权限访问的人员,操作禁止!"); + // + // var devicePermissions = nos.Select(v => new DevicePermissionEntity + // { + // UniqueType = request.UniqueType, + // UniqueValue = request.UniqueValue, + // AssignType = request.AssignType, + // AssignValue = v, + // TenantId = currentTenantId, + // Type = request.Type + // }).ToList(); + // + // await _dbContext.InsertAsync(devicePermissions); + // } + // }, gainfoNos); } ///