feat 数据权限支持用户组

This commit is contained in:
2025-01-08 19:34:09 +08:00
parent 12dad0b8b4
commit c573841849
12 changed files with 123 additions and 55 deletions

View File

@@ -37,7 +37,6 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
db.Ignore<ITenantId>(() =>
{
var userDataPermissions = db.Queryable<DataPermissionEntity>()
.Where(x => x.AssignType == AssignTypeEnumType.User)
.Where(x => x.AssignValue == _currentUser.GetStringSubjectId())
.ToList();
@@ -49,25 +48,45 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
.GetProperties()
.FirstOrDefault(x => x.IsDefined(typeof(DeviceGroupCodeAttribute), false));
var userGroupCodeProperty = typeof(T)
.GetProperties()
.FirstOrDefault(x => x.IsDefined(typeof(UserGroupCodeAttribute), false));
if (userGroupCodeProperty != null)
{
var data = db.Queryable<GainfoGroupEntity>().ToList();
var userGroupCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.UserGroup).Select(x => x.UniqueValue).ToList();
var myCodes = new List<Guid>();
foreach (var userGroupCode in userGroupCodes)
{
myCodes.AddRange(RecursionHelper.HandlerGainfoGroupNextCodes(userGroupCode, data));
}
myCodes = myCodes.Distinct().ToList();
dict.Add(userGroupCodeProperty.Name, myCodes);
}
else
{
var deviceCodes = new List<Guid>();
//先计算分组权限下的设备
var deviceGroupCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group).Select(x => x.UniqueValue).ToList();
var deviceGroupCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.Group).Select(x => x.UniqueValue).ToList();
if (deviceGroupCodes.Any())
{
var data = db.Queryable<DeviceGroupEntity>().ToList();
var myDeviceGroupCodes = new List<Guid>();
var myCodes = new List<Guid>();
foreach (Guid deviceGroupCode in deviceGroupCodes)
{
myDeviceGroupCodes.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(deviceGroupCode, data));
myCodes.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(deviceGroupCode, data));
}
myDeviceGroupCodes = myDeviceGroupCodes.Distinct().ToList();
myCodes = myCodes.Distinct().ToList();
if (deviceCodeProperty != null)
{
deviceCodes = db.Queryable<DeviceGroupRelationshipEntity>().Where(x => myDeviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList();
deviceCodes = db.Queryable<DeviceGroupRelationshipEntity>().Where(x => myCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList();
}
}
@@ -78,10 +97,11 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
if (deviceCodeProperty != null)
{
var currentDeviceCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device).Select(x => x.UniqueValue).ToList();
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;

View File

@@ -30,6 +30,7 @@ public class GainfoGroupsController : ControllerBase
/// <returns></returns>
[HttpGet("tree")]
[IgnoreTenant]
[DataPermission]
public async Task<List<GainfoGroupTreeResponse>> GetTreeAsync()
{
return await _gainfoGroupService.GetTreeAsync();

View File

@@ -55,6 +55,15 @@ public class GainfoGroupService : IGainfoGroupService
var entity = request.Adapt<GainfoGroupEntity>();
entity.Code = Guid.NewGuid();
await _dbContext.InsertAsync(entity);
await _dbContext.InsertAsync(new DataPermissionEntity
{
AssignValue = _currentUser.GetStringSubjectId(),
UniqueType = DataPermissionAssignmentEnumType.UserGroup,
UniqueValue = entity.Code,
DeviceType = null,
TenantId = _currentUser.GetStringTenantId()
});
}
else
{

View File

@@ -0,0 +1,8 @@
using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes;
namespace Dlhis.DataPermission.Model;
[AttributeUsage(AttributeTargets.Property)]
public class UserGroupCodeAttribute : BaseDataPermissionAttribute
{
}

View File

@@ -1,4 +1,5 @@
using Kurisu.AspNetCore.DataAccess.Entity;
using Dlhis.DataPermission.Model;
using Kurisu.AspNetCore.DataAccess.Entity;
using Kurisu.AspNetCore.DataAccess.SqlSugar;
using SqlSugar;
@@ -19,6 +20,7 @@ public class GainfoGroupEntity : SugarBaseEntity, ITenantId
/// <summary>
/// 分组code
/// </summary>
[UserGroupCode]
[SugarColumn(IsNullable = false, ColumnDescription = "分组code")]
public Guid Code { get; set; }

View File

@@ -10,21 +10,17 @@ namespace Dlhis.Entity.Sys.Entities;
[SugarTable(TableName = "DataPermissions")]
public class DataPermissionEntity : SugarBaseEntity, ITenantId
{
[SugarColumn(IsNullable = false, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
public AssignTypeEnumType AssignType { get; set; }
[SugarColumn(IsNullable = false)]
public string AssignValue { get; set; }
[SugarColumn(IsNullable = false, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
public DeviceAssignmentTypeEnumType UniqueType { get; set; }
public DataPermissionAssignmentEnumType UniqueType { get; set; }
[SugarColumn(IsNullable = false)]
public Guid UniqueValue { get; set; }
[SugarColumn(IsNullable = false, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
public DeviceTypeEnumType DeviceType { get; set; }
[SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
public DeviceTypeEnumType? DeviceType { get; set; }
/// <inheritdoc />
public string TenantId { get; set; }

View File

@@ -0,0 +1,28 @@
using System.ComponentModel;
namespace Dlhis.Entity.Sys.Enums;
/// <summary>
/// 数据权限分配类型
/// </summary>
[Description("数据权限分配类型")]
public enum DataPermissionAssignmentEnumType
{
/// <summary>
/// 设备
/// </summary>
[Description("设备")]
Device = 1,
/// <summary>
/// 设备组
/// </summary>
[Description("设备组")]
Group = 2,
/// <summary>
/// 营业点
/// </summary>
[Description("用户组")]
UserGroup = 3
}

View File

@@ -37,7 +37,6 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
db.Ignore<ITenantId>(() =>
{
var userDataPermissions = db.Queryable<DataPermissionEntity>()
.Where(x => x.AssignType == AssignTypeEnumType.User)
.Where(x => x.AssignValue == _currentUser.GetStringSubjectId())
.ToList();
@@ -49,7 +48,7 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
if (deviceCodeProperty != null)
{
var currentDeviceCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device).Select(x => x.UniqueValue).ToList();
var currentDeviceCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.Device).Select(x => x.UniqueValue).ToList();
deviceCodes.AddRange(currentDeviceCodes);
dict.Add(deviceCodeProperty.Name, deviceCodes.Distinct().ToList());
}

View File

@@ -32,7 +32,7 @@ public class DataPermissionsController : ControllerBase
[HttpGet("assignments")]
public async Task<List<Guid>> GetAssignmentsAsync(string assignValue,
[EnumDataType(typeof(DeviceAssignmentTypeEnumType))] DeviceAssignmentTypeEnumType uniqueType,
[EnumDataType(typeof(DataPermissionAssignmentEnumType))] DataPermissionAssignmentEnumType uniqueType,
DeviceTypeEnumType type)
{
return await _dataPermissionService.GetAssignmentsAsync(assignValue, uniqueType, type);

View File

@@ -9,20 +9,24 @@ public class DataPermissionSaveRequest : IValidatableObject
[Required]
public string AssignValue { get; set; }
[EnumDataType(typeof(DeviceAssignmentTypeEnumType))]
public DeviceAssignmentTypeEnumType UniqueType { get; set; }
[EnumDataType(typeof(DataPermissionAssignmentEnumType))]
public DataPermissionAssignmentEnumType UniqueType { get; set; }
public List<Guid> Codes { get; set; }
public List<Guid> Codes { get; set; } = new();
[EnumDataType(typeof(DeviceTypeEnumType))]
public DeviceTypeEnumType Type { get; set; }
public DeviceTypeEnumType? Type { get; set; }
/// <inheritdoc />
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (UniqueType == DeviceAssignmentTypeEnumType.BusinessPlace)
if (UniqueType is DataPermissionAssignmentEnumType.Device or DataPermissionAssignmentEnumType.Group)
{
yield return new ValidationResult("不支持营业点分配", new[] { nameof(UniqueType) });
if (!Type.HasValue)
{
yield return new ValidationResult("类型" + UniqueType + "需要传入Type");
}
}
}
}

View File

@@ -8,5 +8,5 @@ public interface IDataPermissionService : IScopeDependency
{
Task SaveAsync(DataPermissionSaveRequest request);
Task<List<Guid>> GetAssignmentsAsync(string assignValue, DeviceAssignmentTypeEnumType uniqueType, DeviceTypeEnumType type);
Task<List<Guid>> GetAssignmentsAsync(string assignValue, DataPermissionAssignmentEnumType uniqueType, DeviceTypeEnumType? type);
}

View File

@@ -3,6 +3,7 @@ using Dlhis.Entity.Sys.Entities;
using Dlhis.Entity.Sys.Enums;
using Dlhis.Sys.DataPermission.Request;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Utils.Extensions;
namespace Dlhis.Sys.DataPermission.Services.Implements;
@@ -20,30 +21,30 @@ public class DataPermissionService : IDataPermissionService
{
var data = await _dbContext.Queryable<DataPermissionEntity>()
.Where(x => x.AssignValue == request.AssignValue)
.Where(x => x.AssignType == AssignTypeEnumType.User)
.Where(x => x.UniqueType == request.UniqueType)
.Where(x => x.DeviceType == request.Type)
.WhereIF(request.Type.HasValue, x => x.DeviceType == request.Type)
.ToListAsync();
await _dbContext.DeleteReallyAsync(data);
if (request.Codes.IsPresent())
{
await _dbContext.InsertAsync(request.Codes.Select(x => new DataPermissionEntity
{
AssignType = AssignTypeEnumType.User,
AssignValue = request.AssignValue,
UniqueType = request.UniqueType,
UniqueValue = x,
DeviceType = request.Type
}).ToList());
}
}
public async Task<List<Guid>> GetAssignmentsAsync(string assignValue, DeviceAssignmentTypeEnumType uniqueType, DeviceTypeEnumType type)
public async Task<List<Guid>> GetAssignmentsAsync(string assignValue, DataPermissionAssignmentEnumType uniqueType, DeviceTypeEnumType? type)
{
return await _dbContext.Queryable<DataPermissionEntity>()
.Where(x => x.AssignValue == assignValue)
.Where(x => x.AssignType == AssignTypeEnumType.User)
.Where(x => x.UniqueType == uniqueType)
.Where(x => x.DeviceType == type)
.WhereIF(type.HasValue, x => x.DeviceType == type)
.Select(x => x.UniqueValue)
.ToListAsync();
}