From 38fbfbf983a33680d4ab8e4224b945e044bae11e Mon Sep 17 00:00:00 2001 From: liguoyang Date: Fri, 21 Mar 2025 12:53:53 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E7=BB=9F=E4=B8=80=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionsController.cs | 6 +- .../Device/Request/DeviceGainfoReset.cs | 6 + .../Device/Request/DeviceWithGainfoRequest.cs | 7 + .../Services/IDevicePermissionService.cs | 11 +- .../Implements/DevicePermissionService.cs | 254 +++++++++--------- 5 files changed, 158 insertions(+), 126 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index d4028282..d7b1a1c7 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -92,11 +92,15 @@ public class DevicePermissionsController : ControllerBase return await _devicePermissionService.GetGainfoPageByDeviceAsync(request); } + /// + /// 设备人员下发重置 + /// + /// [HttpPost("gainfos/reset")] [CrossTenant] public async Task ResetGainfoPageByDeviceAsync(DeviceGainfoReset request) { - await _devicePermissionService.ResetGainfoPageByDeviceAsync(request.Code); + await _devicePermissionService.ResetGainfoPageByDeviceAsync(request.Code, request.UserType); } [HttpGet("userPermissionCodes")] diff --git a/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs b/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs index a74606f0..c7614ba6 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs @@ -1,6 +1,12 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Basic.Enums; + namespace Dlhis.Basic.Device.Request; public class DeviceGainfoReset { public Guid Code { get; set; } + + [EnumDataType(typeof(GainfoUserTypeEnumType))] + public GainfoUserTypeEnumType? UserType { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs index 2836c0de..ef4dc68f 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Basic.Enums; using Kurisu.AspNetCore.DataAccess.Dto; namespace Dlhis.Basic.Device.Request; @@ -10,4 +11,10 @@ public class DeviceWithGainfoRequest : PageDto /// [Required(ErrorMessage = "设备号不能为空")] public string DeviceUniqueNo { get; set; } + + /// + /// 用户类型 + /// + [EnumDataType(typeof(GainfoUserTypeEnumType))] + public GainfoUserTypeEnumType? UserType { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 921c50cf..24da92c2 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -1,6 +1,6 @@ -using Dlhis.Basic.Device.Dtos; -using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; +using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.DataAccess.Dto; @@ -21,7 +21,7 @@ public interface IDevicePermissionService : IScopeDependency /// /// Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request); - + //Task AssignToUniqueImportAsync(IFormFile file); /// @@ -43,9 +43,10 @@ public interface IDevicePermissionService : IScopeDependency Task> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request); /// - /// 重新下载设备中所有人员 + /// 重新下发设备中人员 /// /// + /// /// - Task ResetGainfoPageByDeviceAsync(Guid code); + Task ResetGainfoPageByDeviceAsync(Guid code, GainfoUserTypeEnumType? userType); } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 8174cc14..70e08d34 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -15,7 +15,6 @@ using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; -using OfficeOpenXml; using SqlSugar; namespace Dlhis.Basic.Device.Services.Implements; @@ -232,78 +231,13 @@ public class DevicePermissionService : IDevicePermissionService public async Task> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request) { - var device = await _dbContext.Queryable() - .Where(x => x.UniqueNo == request.DeviceUniqueNo) - .SingleAsync(); - device.ThrowIfNull("设备不存在"); - - var departments = await _dbContext.Queryable().ToListAsync(); - - //当前设备的分组 - var groups = await _dbContext.Queryable() - .Where(x => x.DeviceCode == device.Code) - .Select(x => x.GroupCode) - .ToListAsync(); - - var permissions = await _dbContext.Queryable() - .Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code) || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue))) - .ToListAsync(); - - var ids = new List(); - foreach (var permission in permissions) - { - switch (permission.AssignType) - { - case AssignTypeEnumType.User: - ids.Add(await _dbContext.Queryable().Where(x => x.No == permission.AssignValue).Select(x => x.Id).SingleAsync()); - break; - case AssignTypeEnumType.Group: - { - var code = Guid.Parse(permission.AssignValue); - ids.AddRange(await _dbContext.Queryable().Where(x => x.Code == code) - .LeftJoin((a, b) => a.Code == b.GroupCode) - .LeftJoin((a, b, c) => b.UserNo == c.No) - .Select((a, b, c) => c.Id).ToListAsync()); - } - break; - case AssignTypeEnumType.Department: - { - //递归向上获取 assignValue = department.No - var arr = permission.AssignValue.Split(":"); - var tenantId = arr.First(); - var currentDepartmentNo = arr.Last(); - var departmentNos = RecursionHelper.HandlerDepartmentNextCodes(currentDepartmentNo, departments); - - ids.AddRange(await _dbContext.Queryable().Where(x => x.Factory == tenantId && departmentNos.Contains(x.DepartmentNo)).Select(x => x.Id).ToListAsync()); - } - break; - case AssignTypeEnumType.Tenant: - { - ids.AddRange(await _dbContext.Queryable().Where(x => x.Factory == permission.AssignValue).Select(x => x.Id).ToListAsync()); - } - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - - ids = ids.Distinct().ToList(); - var factorySetting = await _factorySettingService.GetFactorySettingAsync(device.TenantId, false); - - var page = await _dbContext.Queryable() - .Where(x => ids.Contains(x.Id)) - .Where(x => x.Type != GainfoUserTypeEnumType.External) - .WhereIF(factorySetting.EnableOutsourceDown == false, x => x.Type != GainfoUserTypeEnumType.Outsource) - .WhereIF(device.Type == DeviceTypeEnumType.Meal, x => x.Type != GainfoUserTypeEnumType.External && x.Type != GainfoUserTypeEnumType.Outsource) - .WhereIF(request.Search.IsPresent(), x => x.Code == request.Search || x.Name.Contains(request.Search)) - .Select() - .ToPageListAsync(request); - + var query = await GetDeviceUsersQueryAsync(request.DeviceUniqueNo, request.Search, request.UserType); + var page = await query.ToPageListAsync(request); var userNos = page.Data.Select(x => x.No).ToList(); var downStatus = await _dbContext.Queryable() .Where(x => userNos.Contains(x.UserNo)) - .Where(x => x.DeviceUniqueNo == device.UniqueNo) + .Where(x => x.DeviceUniqueNo == request.DeviceUniqueNo) .Where(x => x.Status == DeviceTaskStatusEnumType.Success) .Select(x => new { @@ -338,61 +272,14 @@ public class DevicePermissionService : IDevicePermissionService } /// - public async Task ResetGainfoPageByDeviceAsync(Guid code) + public async Task ResetGainfoPageByDeviceAsync(Guid code, GainfoUserTypeEnumType? userType) { var device = await _dbContext.Queryable().Where(x => x.Code == code).SingleAsync(); device.ThrowIfNull("设备不存在"); - var departments = await _dbContext.Queryable().ToListAsync(); - //当前设备的分组 - var groups = await _dbContext.Queryable() - .Where(x => x.DeviceCode == device.Code) - .Select(x => x.GroupCode) - .ToListAsync(); - - var permissions = await _dbContext.Queryable() - .Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code) || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue))) - .ToListAsync(); - - var gainfoNos = new List(); - foreach (var permission in permissions) - { - switch (permission.AssignType) - { - case AssignTypeEnumType.User: - gainfoNos.Add(await _dbContext.Queryable().Where(x => x.No == permission.AssignValue).Select(x => x.No).SingleAsync()); - break; - case AssignTypeEnumType.Group: - { - var groupCode = Guid.Parse(permission.AssignValue); - gainfoNos.AddRange(await _dbContext.Queryable().Where(x => x.Code == groupCode) - .LeftJoin((a, b) => a.Code == b.GroupCode) - .LeftJoin((a, b, c) => b.UserNo == c.No) - .Select((a, b, c) => c.No).ToListAsync()); - } - break; - case AssignTypeEnumType.Department: - { - //递归向上获取 assignValue = department.No - var arr = permission.AssignValue.Split(":"); - var tenantId = arr.First(); - var currentDepartmentNo = arr.Last(); - var departmentNos = RecursionHelper.HandlerDepartmentNextCodes(currentDepartmentNo, departments); - - gainfoNos.AddRange(await _dbContext.Queryable().Where(x => x.Factory == tenantId && departmentNos.Contains(x.DepartmentNo)).Select(x => x.No).ToListAsync()); - } - break; - case AssignTypeEnumType.Tenant: - { - gainfoNos.AddRange(await _dbContext.Queryable().Where(x => x.Factory == permission.AssignValue).Select(x => x.No).ToListAsync()); - } - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - - gainfoNos = gainfoNos.Distinct().ToList(); + var query = await GetDeviceUsersQueryAsync(device.UniqueNo, string.Empty, userType); + var all = await query.ToListAsync(); + var gainfoNos = all.Select(x => x.No).Distinct().ToList(); await _dbContext.InsertAsync(gainfoNos.Select(x => new DeviceTaskEntity { @@ -407,6 +294,7 @@ public class DevicePermissionService : IDevicePermissionService }).ToList()); } + public async Task GenerateDeviceTasksAsync(string userNo, DeviceTaskEnumType taskType, string source) { var deviceCodes = await GetUserDeviceCodesByNoAsync(userNo); @@ -443,4 +331,130 @@ public class DevicePermissionService : IDevicePermissionService var result = await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(new List { no }); return result.First().Value.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList(); } + + + //********************************************************************help methods******************************************************************************************** + + /// + /// 获取设备下的人员 + /// + /// + /// + /// + /// + /// + private async Task> GetDeviceUsersQueryAsync(string deviceUniqueNo, string search, GainfoUserTypeEnumType? userType) + { + var device = await _dbContext.Queryable() + .Where(x => x.UniqueNo == deviceUniqueNo) + .SingleAsync(); + device.ThrowIfNull("设备不存在"); + + var departments = await _dbContext.Queryable().ToListAsync(); + + //当前设备的分组 + var groups = await _dbContext.Queryable() + .Where(x => x.DeviceCode == device.Code) + .Select(x => x.GroupCode) + .ToListAsync(); + + var permissions = await _dbContext.Queryable() + .Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code) + || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue))) + .ToListAsync(); + + var ids = new List(); + foreach (var permissionGroup in permissions.GroupBy(x => x.AssignType)) + { + var assignType = permissionGroup.Key; + var assignValues = permissionGroup.Select(x => x.AssignValue).ToList(); + switch (assignType) + { + case AssignTypeEnumType.User: + ids.AddRange(await _dbContext.Queryable() + .Where(x => assignValues.Contains(x.No)) + .Select(x => x.Id) + .ToListAsync() + ); + break; + case AssignTypeEnumType.Group: + { + var codes = assignValues.Select(Guid.Parse); + ids.AddRange(await _dbContext.Queryable() + .LeftJoin((a, b) => a.Code == b.GroupCode) + .LeftJoin((a, b, c) => b.UserNo == c.No) + .Where(a => codes.Contains(a.Code)) + .Select((a, b, c) => c.Id) + .ToListAsync() + ); + } + break; + case AssignTypeEnumType.Department: + { + //递归向上获取 assignValue = tenant:department + var tenantDepartments = assignValues.Select(x => + { + var arr = x.Split(":"); + var currentDepartmentNo = arr.Last(); + var departmentNos = RecursionHelper.HandlerDepartmentNextCodes(currentDepartmentNo, departments); + return new + { + tenantId = arr.First(), departmentNos + }; + }); + + var where = LinqExpressionExtensions.False(); + foreach (var tenantDepartment in tenantDepartments) + { + where = where.Or(x => x.Factory == tenantDepartment.tenantId && tenantDepartment.departmentNos.Contains(x.DepartmentNo)); + } + + ids.AddRange(await _dbContext.Queryable() + .Where(where) + .Select(x => x.Id) + .ToListAsync() + ); + } + break; + case AssignTypeEnumType.Tenant: + { + ids.AddRange(await _dbContext.Queryable() + .Where(x => assignValues.Contains(x.Factory)) + .Select(x => x.Id) + .ToListAsync() + ); + } + break; + default: + throw new ArgumentOutOfRangeException($"不支持的权限类型:{assignType}"); + } + } + + ids = ids.Distinct().ToList(); + var factorySetting = await _factorySettingService.GetFactorySettingAsync(device.TenantId, false); + var userTypes = new List(); + if (userType.HasValue) + { + if (userType == GainfoUserTypeEnumType.Normal) + { + userTypes.Add(GainfoUserTypeEnumType.Normal); + userTypes.Add(GainfoUserTypeEnumType.SecurityWhite); + } + else + { + userTypes.Add(userType.Value); + } + } + + var query = _dbContext.Queryable() + .Where(x => ids.Contains(x.Id)) + .WhereIF(userTypes.Any(), x => userTypes.Contains(x.Type)) + .Where(x => x.Type != GainfoUserTypeEnumType.External) + .WhereIF(factorySetting.EnableOutsourceDown == false, x => x.Type != GainfoUserTypeEnumType.Outsource) + .WhereIF(device.Type == DeviceTypeEnumType.Meal, x => x.Type != GainfoUserTypeEnumType.External && x.Type != GainfoUserTypeEnumType.Outsource) + .WhereIF(search.IsPresent(), x => x.Code == search || x.Name.Contains(search)) + .Select(); + + return query; + } } \ No newline at end of file