diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index 0e26e4f6..1770f26f 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -39,7 +39,7 @@ public class DevicePermissionsController : ControllerBase } /// - /// 分配权限到设备/设备组/营业点 + /// 分配权限到设备 /// /// [HttpPost("assign-unique")] diff --git a/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs new file mode 100644 index 00000000..518cf49d --- /dev/null +++ b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionSourceDto.cs @@ -0,0 +1,27 @@ +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Basic.Device.Dtos; + +public class DevicePermissionSourceDto +{ + public string Factory { get; set; } + + public IEnumerable Types { get; set; } +} + +public class DevicePermissionSourceTypeDto +{ + /// + /// 分配类型 + /// + public AssignTypeEnumType AssignType { get; init; } + + /// + /// 分配值 + /// + public string AssignValue { get; init; } + + public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + public IEnumerable Codes { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs index 9e511afc..8876e200 100644 --- a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs +++ b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs @@ -37,7 +37,6 @@ public class AssignTypeDeviceCode /// public List Codes { get; set; } - public List OriginalCodes { get; set; } } diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs index aca6ea05..fec467ac 100644 --- a/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionsAssignToDeviceRequest.cs @@ -1,45 +1,14 @@ -using System.ComponentModel.DataAnnotations; -using Dlhis.Entity.Device.Enums; -using Dlhis.Entity.Sys.Enums; +namespace Dlhis.Basic.Device.Request; -namespace Dlhis.Basic.Device.Request; - -public class DevicePermissionsAssignToDeviceRequest : IValidatableObject +public class DevicePermissionsAssignToDeviceRequest { - /// - /// 分配类型 - /// - public DeviceAssignmentTypeEnumType UniqueType { get; set; } - /// /// 分配值 /// public Guid UniqueValue { get; set; } - /// - /// 来源 - /// - public AssignTypeEnumType AssignType { get; set; } - /// /// 来源值 /// public List Values { get; set; } - - - [EnumDataType(typeof(DeviceTypeEnumType))] - public DeviceTypeEnumType Type { get; set; } - - /// - /// 只删除权限 - /// - public bool IsDelete { get; set; } - - public IEnumerable Validate(ValidationContext validationContext) - { - if (AssignType != AssignTypeEnumType.User) - { - yield return new ValidationResult("仅支持导入档案人员", new[] { nameof(AssignType) }); - } - } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs index b28664d4..77dec70b 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs @@ -12,19 +12,25 @@ namespace Dlhis.Basic.Device.Services; /// public interface IDevicePermissionAnalyzeService : IScopeDependency { - Task> GetDevicePermissions(DevicePermissionSaveRequest request); + Task> GetDevicePermissionsAsync(DevicePermissionSaveRequest request); Task GenerateDeviceTasksAsync(Func func, List userNos); - Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( - List userNos, - DeviceAssignmentTypeEnumType? ignoreUniqueType = null, - string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null - ); - Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request); Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request); Task> GetAssignDeviceCodesAsync(string userCode); + + + Task>> GetUserAssignDeviceCodesInTenantAsync( + List userNos, + DeviceAssignmentTypeEnumType? ignoreUniqueType = null, + string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null); + + Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( + List userNos, + DeviceAssignmentTypeEnumType? ignoreUniqueType = null, + string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null + ); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 17b9d049..b3f56470 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -21,7 +21,7 @@ public interface IDevicePermissionService : IScopeDependency /// /// /// - Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request); + Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request); Task AssignToUniqueImportAsync(IFormFile file); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index e05dded8..a45c8391 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -41,7 +41,7 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService await CheckWhetherAssignToTopDeviceGroupAsync(request); await CheckAssignedToTenantAsync(request); - var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request); + var dps = await _devicePermissionAnalyzeService.GetDevicePermissionsAsync(request); try { diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index 5f3695a4..56f6ed32 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -106,6 +106,7 @@ public class DeviceGroupService : IDeviceGroupService await CheckNoNextGroupAsync(group.Code); await CheckGroupTypeMatchAsync(request, group); + await CheckAssignToTenantAsync(group.Code, request.DeviceCodes); var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); @@ -125,6 +126,23 @@ public class DeviceGroupService : IDeviceGroupService return r; } + private async Task CheckAssignToTenantAsync(Guid groupCode, List deviceCodes) + { + if (await _dbContext.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + .Where(x => x.UniqueValue == groupCode) + .AnyAsync()) + { + (await _dbContext.Queryable() + .Where(x => x.AssignType != AssignTypeEnumType.Tenant) + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device) + .Where(x => deviceCodes.Contains(x.UniqueValue)) + .AnyAsync()).ThrowIfTrue("无法分配设备到该设备组:设备组已分配到厂区"); + } + } + + private async Task PermissionResetAsync(Guid groupCode, List beforeDeviceCodes, List presentDeviceCodes) { var codesToAdd = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index 27d135c6..6756c347 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -33,7 +33,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService } - public async Task> GetDevicePermissions(DevicePermissionSaveRequest request) + public async Task> GetDevicePermissionsAsync(DevicePermissionSaveRequest request) { var currentTenantId = await GetCurrentFactoryAsync(request); (bool enableDeviceFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); @@ -196,7 +196,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService IgnoreUniqueType = ignoreUniqueType }; - var codes = GetAssignDeviceCodesInternal(analyzePack, + var codes = GetAssignDeviceCodesPermissions(analyzePack, gainfoGroups, devicePermissions, deviceGroups, @@ -210,7 +210,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService } - private static IEnumerable GetAssignDeviceCodesInternal( + private static IEnumerable GetAssignDeviceCodesPermissions( AnalyzePackDto analyzePack, List gainfoGroups, List devicePermissions, @@ -366,18 +366,17 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService public async Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request) { - var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue; + var r = await GetDevicePermissionsAsync(new DevicePermissionSaveRequest + { + AssignType = request.AssignType, + AssignValue = request.AssignValue, + UniqueType = request.UniqueType, + Codes = null, + TenantId = request.TenantId, + Type = request.Type + }); - (bool enableFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); - - return await _dbContext.Queryable() - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.AssignValue == currentAssignValue) - .Where(x => x.UniqueType == request.UniqueType) - .WhereIF(enableFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Device, x => deviceCodes.Contains(x.UniqueValue)) - .Where(x => x.Type == request.Type) - .Select(x => x.UniqueValue) - .ToListAsync(); + return r.Select(x => x.UniqueValue).ToList(); } public async Task> GetAssignmentUniqueAsync(DeviceGetAssignmentUniquesRequest request) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index e6288e04..316c2eaf 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -46,29 +46,30 @@ public class DevicePermissionService : IDevicePermissionService .AnalyzeAsync(request); } - public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) + public async Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request) { var currentTenantId = _currentUser.GetStringTenantId(); - 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) + //当前匹配的基地权限 + var dps = await _dbContext.Queryable() + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device) .Where(x => x.UniqueValue == request.UniqueValue) - .Where(x => x.AssignType == request.AssignType) - .Where(x => x.Type == request.Type) + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.Type == device.Type) .Where(x => x.TenantId == currentTenantId) .ToListAsync(); - var beforeNos = p.Select(x => x.AssignValue).ToList(); - var presentNos = new List(); + var beforeUserNos = dps.Select(x => x.AssignValue).ToList(); + var presentUserNos = new List(); + if (request.Values.IsPresent()) { - presentNos = await _dbContext.Client.Queryable() + var today = DateTime.Today; + var factories = _currentUser.GetUserClaim("tenants").Split(",").ToList(); + presentUserNos = await _dbContext.Client.Queryable() .Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable() .Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today)) .Any() @@ -76,57 +77,83 @@ public class DevicePermissionService : IDevicePermissionService .Where(gainfo => request.Values.Contains(gainfo.Code) || request.Values.Contains(gainfo.No) || request.Values.Contains(gainfo.IdNo)) .Select(gainfo => gainfo.No) .ToListAsync(); - - //gainfoNos = gainfoNos.Concat(nos).Distinct().ToList(); } - var adds = presentNos.Except(beforeNos); - var deletes = beforeNos.Except(presentNos); + var tasksToAdd = new List(); + var tasksToDelete = new List(); - await _dbContext.DeleteAsync(p); - var devicePermissions = presentNos.Select(v => new DevicePermissionEntity + try { - UniqueType = request.UniqueType, - UniqueValue = request.UniqueValue, - AssignType = request.AssignType, - AssignValue = v, - TenantId = currentTenantId, - Type = request.Type - }).ToList(); + var usersToAdd = presentUserNos.Except(beforeUserNos); + var usersToDelete = beforeUserNos.Except(presentUserNos).ToList(); - await _dbContext.InsertAsync(devicePermissions); + var userTenantDeviceCodes = usersToDelete.IsPresent() + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(beforeUserNos.Union(presentUserNos).ToList()) + : new Dictionary>(); - await _dbContext.InsertAsync(adds.Select(x => new DeviceTaskEntity + tasksToAdd.AddRange(usersToAdd.Select(userNo => new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Add, + DeviceType = device.Type, + UserId = null, + UserNo = userNo, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 20, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = currentTenantId, + })); + + foreach (var item in usersToDelete) + { + var permissions = userTenantDeviceCodes[item].ToList(); + foreach (var permission in permissions) + { + permission.AssignTypes = permission.AssignTypes.Where(x => x.UniqueType != DeviceAssignmentTypeEnumType.Device).ToList(); + } + + var myDeviceCodes = permissions.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList(); + if (myDeviceCodes.All(x => x != device.Code)) + { + tasksToDelete.Add(new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Delete, + DeviceType = device.Type, + UserId = null, + UserNo = item, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 20, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = currentTenantId + }); + } + } + } + finally { - 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 = currentTenantId, - }).ToList()); + await _dbContext.InsertAsync(tasksToAdd); + await _dbContext.InsertAsync(tasksToDelete); - 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 = currentTenantId - }).ToList()); + await _dbContext.DeleteAsync(dps); + await _dbContext.InsertAsync(presentUserNos.Select(v => new DevicePermissionEntity + { + UniqueType = DeviceAssignmentTypeEnumType.Device, + UniqueValue = request.UniqueValue, + AssignType = AssignTypeEnumType.User, + AssignValue = v, + TenantId = currentTenantId, + Type = device.Type + }).ToList()); + } + + return new DevicePermissionAssignResponse(tasksToAdd.Count, tasksToDelete.Count); } /// diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs index 1b3cb8fd..f740694f 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoPermissionsController.cs @@ -51,7 +51,7 @@ public class GainfoPermissionsController : ControllerBase /// /// [HttpGet("assignDeviceCodes")] - public async Task> GetAssignDeviceCodesAsync([FromQuery] DeviceAssRequest request) + public async Task> GetAssignDeviceCodesAsync([FromQuery] DeviceAssRequest request) { return await _gainfoPermissions.GetAssignDeviceCodesAsync(request); } diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs new file mode 100644 index 00000000..0a49cbd3 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Response/GainfoDevicePermissionResponse.cs @@ -0,0 +1,69 @@ +using Dlhis.Basic.Device.Dtos; +using Dlhis.Entity.Device.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.Organization.Response; + +public class GainfoDevicePermissionResponse +{ + public long Id { get; set; } + + /// + /// 设备code + /// + public Guid Code { get; set; } + + /// + /// 设备码,IP/MAC/SNO + /// + public string UniqueNo { get; set; } + + /// + /// 心跳间隔 + /// + public int HeartbeatInterval { get; set; } + + /// + /// 设备机功能类型 + /// + public DeviceTypeEnumType Type { get; set; } + + public string TypeDescription => Type.GetDescription(); + + /// + /// 是否启用 + /// + public bool Enable { get; set; } + + /// + /// 厂区 + /// + public string Factory { get; set; } + + /// + /// 最后心跳时间 + /// + public DateTime? LastHeartbeatTime { get; set; } + + /// + /// 是否在线 + /// + public bool IsOnline + { + get + { + if (!LastHeartbeatTime.HasValue) + return false; + + if (HeartbeatInterval <= 0) + return true; + + return LastHeartbeatTime.Value.AddSeconds(HeartbeatInterval) >= DateTime.Now; + } + } + + /// + /// 分配来源 + /// + public DevicePermissionSourceDto Source { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs index a5b7caed..544479bb 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoPermissionService.cs @@ -13,7 +13,7 @@ public interface IGainfoPermissionService : IScopeDependency Task> GetDevicesUnderGroupByUserNoAsync(string userNo, Guid deviceGroupCode); - Task> GetAssignDeviceCodesAsync(DeviceAssRequest request); + Task> GetAssignDeviceCodesAsync(DeviceAssRequest request); Task> GetAssignGroupAsync(string userNo); diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index 49609e4b..f0e15b8c 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -93,8 +93,7 @@ public class GainfoGroupService : IGainfoGroupService var relations = await _dbContext.Queryable() .Where(x => x.GroupCode == request.GroupCode) .ToListAsync(); - - + var presentUserNos = await _dbContext.Queryable() .Where(x => request.UserNos.Contains(x.No) || request.UserNos.Contains(x.Code)) //NO和工号匹配 .Select(x => x.No) diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs index 5889d5ef..69691702 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissionService.cs @@ -1,4 +1,5 @@ -using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Basic.Device.Services; using Dlhis.Basic.Organization.Request; @@ -118,27 +119,39 @@ public class GainfoPermissionService : IGainfoPermissionService }).ToList(); } - public async Task> GetAssignDeviceCodesAsync(DeviceAssRequest request) + public async Task> GetAssignDeviceCodesAsync(DeviceAssRequest request) { - var ids = await _devicePermissionAnalyzeService.GetAssignDeviceCodesAsync(request.UserNo); + var result = await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(new List { request.UserNo }); + var permissions = result[request.UserNo].ToList(); + + var codes = permissions.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList(); var page = await _dbContext.Queryable() - .LeftJoin((d, dt) => d.TemplateCode == dt.Code) - .LeftJoin((d, dt, dr) => d.UniqueNo == dr.DeviceUniqueNo) - .LeftJoin((d, dt, dr, bp) => dr.BusinessPlaceCode == bp.Code) + .LeftJoin((d, dr) => d.UniqueNo == dr.DeviceUniqueNo) .WhereIF(request.DeviceType.HasValue, d => d.Type == request.DeviceType) - .Where(d => ids.Contains(d.Code)) - .Select((d, dt, dr, bp) => new DevicePageResponse - { - FuncsStr = d.Funcs.ToString(), - Brand = dt.Brand, - Type = d.Type, - BusinessPlaceCode = bp.Code, - BusinessPlaceName = bp.Name, - LastHeartbeatTime = dr.LastHeartbeatTime - }, true) + .Where(d => codes.Contains(d.Code)) + .Select((d, dr) => new GainfoDevicePermissionResponse { Factory = d.TenantId }, true) .ToPageListAsync(request); + page.Data.ForEach(item => + { + var permission = permissions.First(x => x.Tenant == item.Factory); + + item.Source = new DevicePermissionSourceDto + { + Factory = item.Factory, + Types = permission.AssignTypes.Where(x => x.Codes.Any(p => p == item.Code)).Select(x => new DevicePermissionSourceTypeDto + { + AssignType = x.AssignType, + AssignValue = x.AssignValue, + UniqueType = x.UniqueType, + Codes = x.UniqueType == DeviceAssignmentTypeEnumType.Device + ? x.Codes.Where(p => p == item.Code) + : x.Codes.Take(1) + }) + }; + }); + return page; }