diff --git a/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs index 2ee6f1d3..707de003 100644 --- a/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs +++ b/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs @@ -44,8 +44,38 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc .GetProperties() .FirstOrDefault(x => x.IsDefined(typeof(DeviceCodeAttribute), false)); + var deviceGroupCodeProperty = typeof(T) + .GetProperties() + .FirstOrDefault(x => x.IsDefined(typeof(DeviceGroupCodeAttribute), false)); + + var deviceCodes = new List(); + //先计算分组权限下的设备 + var deviceGroupCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.Group).Select(x => x.UniqueValue).ToList(); + if (deviceGroupCodes.Any()) + { + var data = db.Queryable().ToList(); + + var myCodes = new List(); + foreach (Guid deviceGroupCode in deviceGroupCodes) + { + myCodes.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(deviceGroupCode, data)); + } + + myCodes = myCodes.Distinct().ToList(); + + if (deviceCodeProperty != null) + { + deviceCodes = db.Queryable().Where(x => myCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList(); + } + } + + if (deviceGroupCodeProperty != null) + { + dict.Add(deviceGroupCodeProperty.Name, deviceGroupCodes); + } + if (deviceCodeProperty != null) { var currentDeviceCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.Device).Select(x => x.UniqueValue).ToList(); diff --git a/Src/Dlhis.ScheduledTask/RecursionHelper.cs b/Src/Dlhis.ScheduledTask/RecursionHelper.cs new file mode 100644 index 00000000..3039719e --- /dev/null +++ b/Src/Dlhis.ScheduledTask/RecursionHelper.cs @@ -0,0 +1,27 @@ +using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Device.Entities; + +namespace Dlhis.ScheduledTask; + +public static class RecursionHelper +{ + + public static List HandlerDeviceGroupNextCodes(Guid current, List data) + { + var result = new List { current }; + + InternalHandlerCodes(current, data, result); + + return result; + + static void InternalHandlerCodes(Guid internalCurrent, List internalData, List internalResult) + { + var next = internalData.Where(x => x.PCode == internalCurrent); + foreach (var item in next) + { + internalResult.Add(item.Code); + InternalHandlerCodes(item.Code, internalData, internalResult); + } + } + } +} \ No newline at end of file