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

View File

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

View File

@@ -55,6 +55,15 @@ public class GainfoGroupService : IGainfoGroupService
var entity = request.Adapt<GainfoGroupEntity>(); var entity = request.Adapt<GainfoGroupEntity>();
entity.Code = Guid.NewGuid(); entity.Code = Guid.NewGuid();
await _dbContext.InsertAsync(entity); await _dbContext.InsertAsync(entity);
await _dbContext.InsertAsync(new DataPermissionEntity
{
AssignValue = _currentUser.GetStringSubjectId(),
UniqueType = DataPermissionAssignmentEnumType.UserGroup,
UniqueValue = entity.Code,
DeviceType = null,
TenantId = _currentUser.GetStringTenantId()
});
} }
else 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 Kurisu.AspNetCore.DataAccess.SqlSugar;
using SqlSugar; using SqlSugar;
@@ -19,6 +20,7 @@ public class GainfoGroupEntity : SugarBaseEntity, ITenantId
/// <summary> /// <summary>
/// 分组code /// 分组code
/// </summary> /// </summary>
[UserGroupCode]
[SugarColumn(IsNullable = false, ColumnDescription = "分组code")] [SugarColumn(IsNullable = false, ColumnDescription = "分组code")]
public Guid Code { get; set; } public Guid Code { get; set; }

View File

@@ -10,21 +10,17 @@ namespace Dlhis.Entity.Sys.Entities;
[SugarTable(TableName = "DataPermissions")] [SugarTable(TableName = "DataPermissions")]
public class DataPermissionEntity : SugarBaseEntity, ITenantId public class DataPermissionEntity : SugarBaseEntity, ITenantId
{ {
[SugarColumn(IsNullable = false, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
public AssignTypeEnumType AssignType { get; set; }
[SugarColumn(IsNullable = false)] [SugarColumn(IsNullable = false)]
public string AssignValue { get; set; } public string AssignValue { get; set; }
[SugarColumn(IsNullable = false, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))] [SugarColumn(IsNullable = false, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
public DeviceAssignmentTypeEnumType UniqueType { get; set; } public DataPermissionAssignmentEnumType UniqueType { get; set; }
[SugarColumn(IsNullable = false)] [SugarColumn(IsNullable = false)]
public Guid UniqueValue { get; set; } public Guid UniqueValue { get; set; }
[SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
[SugarColumn(IsNullable = false, ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))] public DeviceTypeEnumType? DeviceType { get; set; }
public DeviceTypeEnumType DeviceType { get; set; }
/// <inheritdoc /> /// <inheritdoc />
public string TenantId { get; set; } 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>(() => db.Ignore<ITenantId>(() =>
{ {
var userDataPermissions = db.Queryable<DataPermissionEntity>() var userDataPermissions = db.Queryable<DataPermissionEntity>()
.Where(x => x.AssignType == AssignTypeEnumType.User)
.Where(x => x.AssignValue == _currentUser.GetStringSubjectId()) .Where(x => x.AssignValue == _currentUser.GetStringSubjectId())
.ToList(); .ToList();
@@ -49,7 +48,7 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
if (deviceCodeProperty != null) 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); deviceCodes.AddRange(currentDeviceCodes);
dict.Add(deviceCodeProperty.Name, deviceCodes.Distinct().ToList()); dict.Add(deviceCodeProperty.Name, deviceCodes.Distinct().ToList());
} }

View File

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

View File

@@ -9,20 +9,24 @@ public class DataPermissionSaveRequest : IValidatableObject
[Required] [Required]
public string AssignValue { get; set; } public string AssignValue { get; set; }
[EnumDataType(typeof(DeviceAssignmentTypeEnumType))] [EnumDataType(typeof(DataPermissionAssignmentEnumType))]
public DeviceAssignmentTypeEnumType UniqueType { get; set; } public DataPermissionAssignmentEnumType UniqueType { get; set; }
public List<Guid> Codes { get; set; }
public List<Guid> Codes { get; set; } = new();
[EnumDataType(typeof(DeviceTypeEnumType))] [EnumDataType(typeof(DeviceTypeEnumType))]
public DeviceTypeEnumType Type { get; set; } public DeviceTypeEnumType? Type { get; set; }
/// <inheritdoc />
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 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 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.Entity.Sys.Enums;
using Dlhis.Sys.DataPermission.Request; using Dlhis.Sys.DataPermission.Request;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Utils.Extensions;
namespace Dlhis.Sys.DataPermission.Services.Implements; namespace Dlhis.Sys.DataPermission.Services.Implements;
@@ -20,30 +21,30 @@ public class DataPermissionService : IDataPermissionService
{ {
var data = await _dbContext.Queryable<DataPermissionEntity>() var data = await _dbContext.Queryable<DataPermissionEntity>()
.Where(x => x.AssignValue == request.AssignValue) .Where(x => x.AssignValue == request.AssignValue)
.Where(x => x.AssignType == AssignTypeEnumType.User)
.Where(x => x.UniqueType == request.UniqueType) .Where(x => x.UniqueType == request.UniqueType)
.Where(x => x.DeviceType == request.Type) .WhereIF(request.Type.HasValue, x => x.DeviceType == request.Type)
.ToListAsync(); .ToListAsync();
await _dbContext.DeleteReallyAsync(data); await _dbContext.DeleteReallyAsync(data);
await _dbContext.InsertAsync(request.Codes.Select(x => new DataPermissionEntity if (request.Codes.IsPresent())
{ {
AssignType = AssignTypeEnumType.User, await _dbContext.InsertAsync(request.Codes.Select(x => new DataPermissionEntity
AssignValue = request.AssignValue, {
UniqueType = request.UniqueType, AssignValue = request.AssignValue,
UniqueValue = x, UniqueType = request.UniqueType,
DeviceType = request.Type UniqueValue = x,
}).ToList()); 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>() return await _dbContext.Queryable<DataPermissionEntity>()
.Where(x => x.AssignValue == assignValue) .Where(x => x.AssignValue == assignValue)
.Where(x => x.AssignType == AssignTypeEnumType.User)
.Where(x => x.UniqueType == uniqueType) .Where(x => x.UniqueType == uniqueType)
.Where(x => x.DeviceType == type) .WhereIF(type.HasValue, x => x.DeviceType == type)
.Select(x => x.UniqueValue) .Select(x => x.UniqueValue)
.ToListAsync(); .ToListAsync();
} }