feat 数据权限

This commit is contained in:
2024-07-03 14:45:16 +08:00
parent 3db76f2318
commit 435e82c2c0
16 changed files with 339 additions and 5 deletions

View File

@@ -0,0 +1,88 @@
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<string, List<Guid>> GetData<T>()
{
var dict = new Dictionary<string, List<Guid>>(2);
using var scope = _serviceProvider.CreateScope();
var db = scope.ServiceProvider.GetService<IDbContext>();
db.Ignore<ITenantId>(() =>
{
var userDataPermissions = db.Queryable<DataPermissionEntity>()
.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<Guid>();
//先计算分组权限下的设备
var deviceGroupCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group).Select(x => x.UniqueValue).ToList();
if (deviceGroupCodes.Any() && deviceCodeProperty != null)
{
var data = db.Queryable<DeviceGroupEntity>().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<DeviceGroupRelationshipEntity>().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<DeviceGroupEntity> data, List<Guid> 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));
}
}
}

View File

@@ -43,7 +43,7 @@ public class DevicesController : ControllerBase
{
return await _deviceTemplateService.GetPageAsync(request);
}
/// <summary>
/// 设备模板保存
/// </summary>
@@ -90,6 +90,7 @@ public class DevicesController : ControllerBase
/// <param name="request"></param>
/// <returns></returns>
[HttpGet("page")]
[DataPermission(true)]
public async Task<Pagination<DevicePageResponse>> GetPageAsync([FromQuery] DevicePageRequest request)
{
return await _deviceService.GetPageAsync(request);

View File

@@ -71,7 +71,7 @@ public class DeviceService : IDeviceService
var registry = await _dbContext.Queryable<DeviceRegistryEntity>().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync();
if (registry == null)
{
registry = new DeviceRegistryEntity()
registry = new DeviceRegistryEntity
{
DeviceUniqueNo = request.UniqueNo,
LastHeartbeatTime = DateTime.Now,