diff --git a/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs new file mode 100644 index 00000000..afb4ab6d --- /dev/null +++ b/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs @@ -0,0 +1,107 @@ +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.ScheduledTask.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 deviceCodes = new List(); + + 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; + } +} + +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); + } +} \ No newline at end of file