diff --git a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs index 61290c74..13c67868 100644 --- a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs +++ b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs @@ -37,7 +37,6 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc db.Ignore(() => { var userDataPermissions = db.Queryable() - .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(); + 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().ToList(); - - var myDeviceGroupCodes = new List(); - foreach (Guid deviceGroupCode in deviceGroupCodes) + var data = db.Queryable().ToList(); + + var userGroupCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.UserGroup).Select(x => x.UniqueValue).ToList(); + var myCodes = new List(); + 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(); + + //先计算分组权限下的设备 + var deviceGroupCodes = userDataPermissions.Where(x => x.UniqueType == DataPermissionAssignmentEnumType.Group).Select(x => x.UniqueValue).ToList(); + if (deviceGroupCodes.Any()) + { + var data = db.Queryable().ToList(); + + var myCodes = new List(); + foreach (Guid deviceGroupCode in deviceGroupCodes) + { + myCodes.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(deviceGroupCode, data)); + } + + myCodes = myCodes.Distinct().ToList(); + + if (deviceCodeProperty != null) + { + deviceCodes = db.Queryable().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().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; diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs index 3134714c..7dc4db28 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs @@ -30,6 +30,7 @@ public class GainfoGroupsController : ControllerBase /// [HttpGet("tree")] [IgnoreTenant] + [DataPermission] public async Task> GetTreeAsync() { return await _gainfoGroupService.GetTreeAsync(); diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index 6a302996..6bd5e2ab 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -55,6 +55,15 @@ public class GainfoGroupService : IGainfoGroupService var entity = request.Adapt(); 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 { diff --git a/Src/Dlhis.DataPermission.Model/UserGroupCodeAttribute.cs b/Src/Dlhis.DataPermission.Model/UserGroupCodeAttribute.cs new file mode 100644 index 00000000..993439c2 --- /dev/null +++ b/Src/Dlhis.DataPermission.Model/UserGroupCodeAttribute.cs @@ -0,0 +1,8 @@ +using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes; + +namespace Dlhis.DataPermission.Model; + +[AttributeUsage(AttributeTargets.Property)] +public class UserGroupCodeAttribute : BaseDataPermissionAttribute +{ +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs b/Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs index 46d940bc..29fe7825 100644 --- a/Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs +++ b/Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs @@ -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 /// /// 分组code /// + [UserGroupCode] [SugarColumn(IsNullable = false, ColumnDescription = "分组code")] public Guid Code { get; set; } diff --git a/Src/Dlhis.Entity/Sys/Entities/DataPermissionEntity.cs b/Src/Dlhis.Entity/Sys/Entities/DataPermissionEntity.cs index 3f48d66a..4ac4f94c 100644 --- a/Src/Dlhis.Entity/Sys/Entities/DataPermissionEntity.cs +++ b/Src/Dlhis.Entity/Sys/Entities/DataPermissionEntity.cs @@ -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; } /// public string TenantId { get; set; } diff --git a/Src/Dlhis.Entity/Sys/Enums/DataPermissionAssignmentEnumType.cs b/Src/Dlhis.Entity/Sys/Enums/DataPermissionAssignmentEnumType.cs new file mode 100644 index 00000000..1b68ff73 --- /dev/null +++ b/Src/Dlhis.Entity/Sys/Enums/DataPermissionAssignmentEnumType.cs @@ -0,0 +1,28 @@ +using System.ComponentModel; + +namespace Dlhis.Entity.Sys.Enums; + +/// +/// 数据权限分配类型 +/// +[Description("数据权限分配类型")] +public enum DataPermissionAssignmentEnumType +{ + /// + /// 设备 + /// + [Description("设备")] + Device = 1, + + /// + /// 设备组 + /// + [Description("设备组")] + Group = 2, + + /// + /// 营业点 + /// + [Description("用户组")] + UserGroup = 3 +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs index afb4ab6d..2ee6f1d3 100644 --- a/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs +++ b/Src/Dlhis.ScheduledTask/DataPermissions/GetDataPermissionService.cs @@ -37,7 +37,6 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc db.Ignore(() => { var userDataPermissions = db.Queryable() - .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()); } diff --git a/Src/Dlhis.Sys/DataPermission/Controllers/DataPermissionsController.cs b/Src/Dlhis.Sys/DataPermission/Controllers/DataPermissionsController.cs index 2f7ed8cd..d8b42c60 100644 --- a/Src/Dlhis.Sys/DataPermission/Controllers/DataPermissionsController.cs +++ b/Src/Dlhis.Sys/DataPermission/Controllers/DataPermissionsController.cs @@ -32,7 +32,7 @@ public class DataPermissionsController : ControllerBase [HttpGet("assignments")] public async Task> GetAssignmentsAsync(string assignValue, - [EnumDataType(typeof(DeviceAssignmentTypeEnumType))] DeviceAssignmentTypeEnumType uniqueType, + [EnumDataType(typeof(DataPermissionAssignmentEnumType))] DataPermissionAssignmentEnumType uniqueType, DeviceTypeEnumType type) { return await _dataPermissionService.GetAssignmentsAsync(assignValue, uniqueType, type); diff --git a/Src/Dlhis.Sys/DataPermission/Request/DataPermissionSaveRequest.cs b/Src/Dlhis.Sys/DataPermission/Request/DataPermissionSaveRequest.cs index 2b1584d3..393c528e 100644 --- a/Src/Dlhis.Sys/DataPermission/Request/DataPermissionSaveRequest.cs +++ b/Src/Dlhis.Sys/DataPermission/Request/DataPermissionSaveRequest.cs @@ -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 Codes { get; set; } - public List Codes { get; set; } = new(); [EnumDataType(typeof(DeviceTypeEnumType))] - public DeviceTypeEnumType Type { get; set; } - + public DeviceTypeEnumType? Type { get; set; } + /// public IEnumerable 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"); + } } } } \ No newline at end of file diff --git a/Src/Dlhis.Sys/DataPermission/Services/IDataPermissionService.cs b/Src/Dlhis.Sys/DataPermission/Services/IDataPermissionService.cs index b89d6542..3c89301b 100644 --- a/Src/Dlhis.Sys/DataPermission/Services/IDataPermissionService.cs +++ b/Src/Dlhis.Sys/DataPermission/Services/IDataPermissionService.cs @@ -8,5 +8,5 @@ public interface IDataPermissionService : IScopeDependency { Task SaveAsync(DataPermissionSaveRequest request); - Task> GetAssignmentsAsync(string assignValue, DeviceAssignmentTypeEnumType uniqueType, DeviceTypeEnumType type); + Task> GetAssignmentsAsync(string assignValue, DataPermissionAssignmentEnumType uniqueType, DeviceTypeEnumType? type); } \ No newline at end of file diff --git a/Src/Dlhis.Sys/DataPermission/Services/Implements/DataPermissionService.cs b/Src/Dlhis.Sys/DataPermission/Services/Implements/DataPermissionService.cs index 1f9b09a9..c63ca84c 100644 --- a/Src/Dlhis.Sys/DataPermission/Services/Implements/DataPermissionService.cs +++ b/Src/Dlhis.Sys/DataPermission/Services/Implements/DataPermissionService.cs @@ -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() .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> GetAssignmentsAsync(string assignValue, DeviceAssignmentTypeEnumType uniqueType, DeviceTypeEnumType type) + public async Task> GetAssignmentsAsync(string assignValue, DataPermissionAssignmentEnumType uniqueType, DeviceTypeEnumType? type) { return await _dbContext.Queryable() .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(); }