feat 数据权限支持用户组
This commit is contained in:
@@ -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,39 +48,60 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
|
||||
.GetProperties()
|
||||
.FirstOrDefault(x => x.IsDefined(typeof(DeviceGroupCodeAttribute), false));
|
||||
|
||||
var deviceCodes = new List<Guid>();
|
||||
var userGroupCodeProperty = typeof(T)
|
||||
.GetProperties()
|
||||
.FirstOrDefault(x => x.IsDefined(typeof(UserGroupCodeAttribute), false));
|
||||
|
||||
//先计算分组权限下的设备
|
||||
var deviceGroupCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group).Select(x => x.UniqueValue).ToList();
|
||||
if (deviceGroupCodes.Any())
|
||||
if (userGroupCodeProperty != null)
|
||||
{
|
||||
var data = db.Queryable<DeviceGroupEntity>().ToList();
|
||||
var data = db.Queryable<GainfoGroupEntity>().ToList();
|
||||
|
||||
var myDeviceGroupCodes = new List<Guid>();
|
||||
foreach (Guid deviceGroupCode in deviceGroupCodes)
|
||||
var userGroupCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.UserGroup).Select(x => x.UniqueValue).ToList();
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -30,6 +30,7 @@ public class GainfoGroupsController : ControllerBase
|
||||
/// <returns></returns>
|
||||
[HttpGet("tree")]
|
||||
[IgnoreTenant]
|
||||
[DataPermission]
|
||||
public async Task<List<GainfoGroupTreeResponse>> GetTreeAsync()
|
||||
{
|
||||
return await _gainfoGroupService.GetTreeAsync();
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
8
Src/Dlhis.DataPermission.Model/UserGroupCodeAttribute.cs
Normal file
8
Src/Dlhis.DataPermission.Model/UserGroupCodeAttribute.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes;
|
||||
|
||||
namespace Dlhis.DataPermission.Model;
|
||||
|
||||
[AttributeUsage(AttributeTargets.Property)]
|
||||
public class UserGroupCodeAttribute : BaseDataPermissionAttribute
|
||||
{
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
await _dbContext.InsertAsync(request.Codes.Select(x => new DataPermissionEntity
|
||||
if (request.Codes.IsPresent())
|
||||
{
|
||||
AssignType = AssignTypeEnumType.User,
|
||||
AssignValue = request.AssignValue,
|
||||
UniqueType = request.UniqueType,
|
||||
UniqueValue = x,
|
||||
DeviceType = request.Type
|
||||
}).ToList());
|
||||
await _dbContext.InsertAsync(request.Codes.Select(x => new DataPermissionEntity
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user