using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; namespace Dlhis.Basic.DataPermissions; public class GetDataPermissionService : IGetDataPermissions, ISingletonDependency { private readonly ICurrentUser _currentUser; private readonly IServiceProvider _serviceProvider; public GetDataPermissionService(ICurrentUser currentUser, IServiceProvider serviceProvider) { _currentUser = currentUser; _serviceProvider = serviceProvider; } public Dictionary> GetData() { var dict = new Dictionary>(2); var currentRole = _currentUser.GetRole(); if (currentRole is "admin" or "tenant-admin") { return dict; } using var scope = _serviceProvider.CreateScope(); var db = scope.ServiceProvider.GetService(); db.Ignore(() => { var userDataPermissions = db.Queryable() .Where(x => x.AssignType == AssignTypeEnumType.User) .Where(x => x.AssignValue == _currentUser.GetStringSubjectId()) .ToList(); var deviceCodeProperty = typeof(T) .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 == DeviceAssignmentTypeEnumType.Group).Select(x => x.UniqueValue).ToList(); if (deviceGroupCodes.Any() && deviceCodeProperty != null) { var data = db.Queryable().ToList(); //开始递归处理 var tops = data.Where(x => !x.PCode.HasValue).ToList(); tops.ForEach(x => { DeviceGroupRecursionGetNext(x, data, deviceGroupCodes, deviceGroupCodes.Contains(x.Code)); }); deviceGroupCodes = deviceGroupCodes.Distinct().ToList(); deviceCodes = db.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList(); } if (deviceGroupCodeProperty != null && deviceGroupCodes.Any()) { dict.Add(deviceGroupCodeProperty.Name, deviceGroupCodes); } if (deviceCodeProperty != null) { var currentDeviceCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device).Select(x => x.UniqueValue).ToList(); deviceCodes.AddRange(currentDeviceCodes); dict.Add(deviceCodeProperty.Name, deviceCodes.Distinct().ToList()); } }); return dict; } static void DeviceGroupRecursionGetNext(DeviceGroupEntity current, List data, List result, bool add) { var next = data.Where(x => x.PCode == current.Code).ToList(); foreach (var item in next) { if (add) { result.Add(item.Code); } DeviceGroupRecursionGetNext(item, data, result, result.Contains(item.Code)); } } } public interface IMyDataPermissionService : IScopeDependency { List GetMyDeviceCodes(); } public class MyDataPermissionService : IMyDataPermissionService { private readonly IGetDataPermissions _getDataPermissions; public MyDataPermissionService(IGetDataPermissions getDataPermissions) { _getDataPermissions = getDataPermissions; } /// public List GetMyDeviceCodes() { return _getDataPermissions.GetData().FirstOrDefault().Value ?? new List(); } }