feat 数据权限支持用户组
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
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 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; }
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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>(() =>
|
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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user