using Dlhis.Basic.Utils; using Dlhis.DataPermission.Model; 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.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 userGroupCodeProperty = typeof(T) .GetProperties() .FirstOrDefault(x => x.IsDefined(typeof(UserGroupCodeAttribute), false)); if (userGroupCodeProperty != null) { var userGroupCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.UserGroup).Select(x => x.UniqueValue).Distinct().ToList(); dict.Add(userGroupCodeProperty.Name, userGroupCodes); } else { 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(); deviceCodes.AddRange(currentDeviceCodes); dict.Add(deviceCodeProperty.Name, deviceCodes.Distinct().ToList()); } } }); return dict; } } public interface IDataPermissionService : IScopeDependency { (bool, List) GetMyDeviceCodes(); (bool, List) GetMyDeviceGroupCodes(); } public class MyDataPermissionService : IDataPermissionService { private readonly IGetDataPermissions _getDataPermissions; private readonly ICurrentUser _currentUser; public MyDataPermissionService(IGetDataPermissions getDataPermissions, ICurrentUser currentUser) { _getDataPermissions = getDataPermissions; _currentUser = currentUser; } /// public (bool, List) GetMyDeviceCodes() { var codes = new List(); var hasAllPermission = _currentUser.GetRole() is "admin" or "tenant-admin"; if (!hasAllPermission) { codes = _getDataPermissions.GetData().FirstOrDefault().Value ?? new List(); } return (!hasAllPermission, codes); } /// public (bool, List) GetMyDeviceGroupCodes() { var codes = new List(); var hasAllPermission = _currentUser.GetRole() is "admin" or "tenant-admin"; if (!hasAllPermission) { codes = _getDataPermissions.GetData().FirstOrDefault().Value ?? new List(); } return (!hasAllPermission, codes); } }