diff --git a/Dlhis.Jinko.Face.sln b/Dlhis.Jinko.Face.sln index ec9870dc..b7e65f3f 100644 --- a/Dlhis.Jinko.Face.sln +++ b/Dlhis.Jinko.Face.sln @@ -47,7 +47,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.Message", "Src\Dlhis. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.InfoCheck", "Src\Dlhis.InfoCheck\Dlhis.InfoCheck.csproj", "{4D656761-8CE7-4316-A3DF-8C1722D69CCE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.Middle", "Src\Dlhis.Middle\Dlhis.Middle.csproj", "{762C944C-36A1-4F1A-803F-08F9BD8891D1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.Middle", "Src\Dlhis.Middle\Dlhis.Middle.csproj", "{762C944C-36A1-4F1A-803F-08F9BD8891D1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.DataPermission.Model", "Src\Dlhis.DataPermission.Model\Dlhis.DataPermission.Model.csproj", "{CA1427E2-CC70-4489-8653-1C05630C8392}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -123,6 +125,10 @@ Global {762C944C-36A1-4F1A-803F-08F9BD8891D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {762C944C-36A1-4F1A-803F-08F9BD8891D1}.Release|Any CPU.ActiveCfg = Release|Any CPU {762C944C-36A1-4F1A-803F-08F9BD8891D1}.Release|Any CPU.Build.0 = Release|Any CPU + {CA1427E2-CC70-4489-8653-1C05630C8392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA1427E2-CC70-4489-8653-1C05630C8392}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA1427E2-CC70-4489-8653-1C05630C8392}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA1427E2-CC70-4489-8653-1C05630C8392}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs new file mode 100644 index 00000000..1187fb8d --- /dev/null +++ b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs @@ -0,0 +1,88 @@ +using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Sys.Entities; +using Dlhis.Entity.Sys.Enums; +using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; + +namespace Dlhis.Basic.DataPermissions; + +public class GetDataPermissionService : IGetDataPermissions, ISingletonDependency +{ + private readonly ICurrentUser _currentUser; + private readonly IServiceProvider _serviceProvider; + + public GetDataPermissionService(ICurrentUser currentUser, IServiceProvider serviceProvider) + { + _currentUser = currentUser; + _serviceProvider = serviceProvider; + } + + + public Dictionary> GetData() + { + var dict = new Dictionary>(2); + using var scope = _serviceProvider.CreateScope(); + + var db = scope.ServiceProvider.GetService(); + db.Ignore(() => + { + var userDataPermissions = db.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.AssignValue == _currentUser.GetStringSubjectId()) + .ToList(); + + var deviceCodeProperty = typeof(T) + .GetProperties() + .FirstOrDefault(x => x.IsDefined(typeof(DeviceCodeAttribute), false)); + + var deviceGroupCodeProperty = typeof(T) + .GetProperties() + .FirstOrDefault(x => x.IsDefined(typeof(DeviceGroupCodeAttribute), false)); + + + var deviceCodes = new List(); + + //先计算分组权限下的设备 + var deviceGroupCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group).Select(x => x.UniqueValue).ToList(); + if (deviceGroupCodes.Any() && deviceCodeProperty != null) + { + var data = db.Queryable().ToList(); + //开始递归处理 + var tops = data.Where(x => !x.PCode.HasValue).ToList(); + tops.ForEach(x => { DeviceGroupRecursionGetNext(x, data, deviceGroupCodes, deviceGroupCodes.Contains(x.Code)); }); + deviceGroupCodes = deviceGroupCodes.Distinct().ToList(); + deviceCodes = db.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList(); + } + + if (deviceGroupCodeProperty != null && deviceGroupCodes.Any()) + { + 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; + } + + static void DeviceGroupRecursionGetNext(DeviceGroupEntity current, List data, List result, bool add) + { + var next = data.Where(x => x.PCode == current.Code).ToList(); + foreach (var item in next) + { + if (add) + { + result.Add(item.Code); + } + + DeviceGroupRecursionGetNext(item, data, result, result.Contains(item.Code)); + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs index f4ed6272..28bc2bdd 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs @@ -43,7 +43,7 @@ public class DevicesController : ControllerBase { return await _deviceTemplateService.GetPageAsync(request); } - + /// /// 设备模板保存 /// @@ -90,6 +90,7 @@ public class DevicesController : ControllerBase /// /// [HttpGet("page")] + [DataPermission(true)] public async Task> GetPageAsync([FromQuery] DevicePageRequest request) { return await _deviceService.GetPageAsync(request); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs index 049b31a1..967a1936 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs @@ -71,7 +71,7 @@ public class DeviceService : IDeviceService var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync(); if (registry == null) { - registry = new DeviceRegistryEntity() + registry = new DeviceRegistryEntity { DeviceUniqueNo = request.UniqueNo, LastHeartbeatTime = DateTime.Now, diff --git a/Src/Dlhis.DataPermission.Model/DeviceCodeAttribute.cs b/Src/Dlhis.DataPermission.Model/DeviceCodeAttribute.cs new file mode 100644 index 00000000..764d995b --- /dev/null +++ b/Src/Dlhis.DataPermission.Model/DeviceCodeAttribute.cs @@ -0,0 +1,8 @@ +using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes; + +namespace Dlhis.Basic.DataPermissions; + +[AttributeUsage(AttributeTargets.Property)] +public class DeviceCodeAttribute : BaseDataPermissionAttribute +{ +} \ No newline at end of file diff --git a/Src/Dlhis.DataPermission.Model/DeviceGroupCodeAttribute.cs b/Src/Dlhis.DataPermission.Model/DeviceGroupCodeAttribute.cs new file mode 100644 index 00000000..3f232bc4 --- /dev/null +++ b/Src/Dlhis.DataPermission.Model/DeviceGroupCodeAttribute.cs @@ -0,0 +1,8 @@ +using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes; + +namespace Dlhis.Basic.DataPermissions; + +[AttributeUsage(AttributeTargets.Property)] +public class DeviceGroupCodeAttribute : BaseDataPermissionAttribute +{ +} \ No newline at end of file diff --git a/Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj b/Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj new file mode 100644 index 00000000..ddf857f3 --- /dev/null +++ b/Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs b/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs index ef074069..a4b3eb62 100644 --- a/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs +++ b/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs @@ -1,4 +1,5 @@ -using Dlhis.Entity.Device.Enums; +using Dlhis.Basic.DataPermissions; +using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar; using Mapster; @@ -16,6 +17,7 @@ namespace Dlhis.Entity.Basic.Entity /// /// 设备code /// + [DeviceCode] [SugarColumn(ColumnDescription = "设备code")] public Guid Code { get; set; } diff --git a/Src/Dlhis.Entity/Dlhis.Entity.csproj b/Src/Dlhis.Entity/Dlhis.Entity.csproj index 6daa5ed5..3a1c5245 100644 --- a/Src/Dlhis.Entity/Dlhis.Entity.csproj +++ b/Src/Dlhis.Entity/Dlhis.Entity.csproj @@ -7,7 +7,11 @@ - + + + + + diff --git a/Src/Dlhis.Entity/Sys/Entities/DataPermissionEntity.cs b/Src/Dlhis.Entity/Sys/Entities/DataPermissionEntity.cs new file mode 100644 index 00000000..803502d0 --- /dev/null +++ b/Src/Dlhis.Entity/Sys/Entities/DataPermissionEntity.cs @@ -0,0 +1,17 @@ +using Dlhis.Entity.Sys.Enums; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; + +namespace Dlhis.Entity.Sys.Entities; + +[SugarTable(TableName = "DataPermissions")] +public class DataPermissionEntity : SugarBaseEntity +{ + public AssignTypeEnumType AssignType { get; set; } + + public string AssignValue { get; set; } + + public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + public Guid UniqueValue { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Visitor/Entity/BusinessTripEntity.cs b/Src/Dlhis.Entity/Visitor/Entity/BusinessTripEntity.cs new file mode 100644 index 00000000..00e93578 --- /dev/null +++ b/Src/Dlhis.Entity/Visitor/Entity/BusinessTripEntity.cs @@ -0,0 +1,68 @@ +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; + +namespace Dlhis.Entity.Visitor.Entity; + +[SugarTable(TableName = "BusinessTrip")] +public class BusinessTripEntity : SugarBaseEntity +{ + /// + /// 工号 + /// + public string Code { get; set; } + + /// + /// 姓名 + /// + public string Name { get; set; } + + /// + /// 开始日期 + /// + public string BeginDate { get; set; } + + /// + /// 结束日期 + /// + public string EndDate { get; set; } + + /// + /// 开始时间 + /// + public DateTime BeginDateTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime EndDateTime { get; set; } + + /// + /// 出差类型 + /// + public string Type { get; set; } + + /// + /// 出差类型描述 + /// + public string TypeDesc { get; set; } + + /// + /// 出差时数 + /// + public int Hour { get; set; } + + /// + /// 出差天数 + /// + public double Day { get; set; } + + /// + /// 出差目的地 + /// + public string Destination { get; set; } + + /// + /// 出差目的地描述 + /// + public string DestinationDesc { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/DataPermission/Controllers/DataPermissionsController.cs b/Src/Dlhis.Sys/DataPermission/Controllers/DataPermissionsController.cs new file mode 100644 index 00000000..5469b7b6 --- /dev/null +++ b/Src/Dlhis.Sys/DataPermission/Controllers/DataPermissionsController.cs @@ -0,0 +1,37 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Sys.Enums; +using Dlhis.Sys.DataPermission.Request; +using Dlhis.Sys.DataPermission.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Sys.DataPermission.Controllers; + +/// +/// 数据权限 +/// +[Authorize] +[Route("api/[controller]")] +[ApiController] +public class DataPermissionsController : ControllerBase +{ + private readonly IDataPermissionService _dataPermissionService; + + public DataPermissionsController(IDataPermissionService dataPermissionService) + { + _dataPermissionService = dataPermissionService; + } + + [HttpPost("save")] + public async Task SaveAsync(DataPermissionSaveRequest request) + { + await _dataPermissionService.SaveAsync(request); + } + + + [HttpGet("assignments")] + public async Task> GetAssignmentsAsync(string assignValue, [EnumDataType(typeof(DeviceAssignmentTypeEnumType))] DeviceAssignmentTypeEnumType uniqueType) + { + return await _dataPermissionService.GetAssignmentsAsync(assignValue, uniqueType); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/DataPermission/Request/DataPermissionSaveRequest.cs b/Src/Dlhis.Sys/DataPermission/Request/DataPermissionSaveRequest.cs new file mode 100644 index 00000000..952deeee --- /dev/null +++ b/Src/Dlhis.Sys/DataPermission/Request/DataPermissionSaveRequest.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Sys.DataPermission.Request; + +public class DataPermissionSaveRequest : IValidatableObject +{ + [Required] + public string AssignValue { get; set; } + + [EnumDataType(typeof(DeviceAssignmentTypeEnumType))] + public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + public List Codes { get; set; } = new(); + + + public IEnumerable Validate(ValidationContext validationContext) + { + if (UniqueType == DeviceAssignmentTypeEnumType.BusinessPlace) + { + yield return new ValidationResult("不支持营业点分配", new[] { nameof(UniqueType) }); + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/DataPermission/Services/IDataPermissionService.cs b/Src/Dlhis.Sys/DataPermission/Services/IDataPermissionService.cs new file mode 100644 index 00000000..fcfdb329 --- /dev/null +++ b/Src/Dlhis.Sys/DataPermission/Services/IDataPermissionService.cs @@ -0,0 +1,11 @@ +using Dlhis.Entity.Sys.Enums; +using Dlhis.Sys.DataPermission.Request; + +namespace Dlhis.Sys.DataPermission.Services; + +public interface IDataPermissionService : IScopeDependency +{ + Task SaveAsync(DataPermissionSaveRequest request); + + Task> GetAssignmentsAsync(string assignValue, DeviceAssignmentTypeEnumType uniqueType); +} \ 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 new file mode 100644 index 00000000..662da832 --- /dev/null +++ b/Src/Dlhis.Sys/DataPermission/Services/Implements/DataPermissionService.cs @@ -0,0 +1,46 @@ +using Dlhis.Entity.Sys.Entities; +using Dlhis.Entity.Sys.Enums; +using Dlhis.Sys.DataPermission.Request; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; + +namespace Dlhis.Sys.DataPermission.Services.Implements; + +public class DataPermissionService : IDataPermissionService +{ + private readonly IDbContext _dbContext; + + public DataPermissionService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + /// + public async Task SaveAsync(DataPermissionSaveRequest request) + { + var data = await _dbContext.Queryable() + .Where(x => x.AssignValue == request.AssignValue) + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.UniqueType == request.UniqueType) + .ToListAsync(); + + await _dbContext.DeleteReallyAsync(data); + + await _dbContext.InsertAsync(request.Codes.Select(x => new DataPermissionEntity + { + AssignType = AssignTypeEnumType.User, + AssignValue = request.AssignValue, + UniqueType = request.UniqueType, + UniqueValue = x + }).ToList()); + } + + public async Task> GetAssignmentsAsync(string assignValue, DeviceAssignmentTypeEnumType uniqueType) + { + return await _dbContext.Queryable() + .Where(x => x.AssignValue == assignValue) + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.UniqueType == uniqueType) + .Select(x => x.UniqueValue) + .ToListAsync(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/Dlhis.Sys.csproj b/Src/Dlhis.Sys/Dlhis.Sys.csproj index ff5b9084..00510a43 100644 --- a/Src/Dlhis.Sys/Dlhis.Sys.csproj +++ b/Src/Dlhis.Sys/Dlhis.Sys.csproj @@ -21,6 +21,7 @@ +