diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index 22956de6..d18943a7 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -121,7 +121,7 @@ public class DevicePermissionsController : ControllerBase /// [HttpGet("gainfo/others")] [IgnoreTenant] - public async Task ExternalAndManuallyUserNoAsync(string deviceUniqueNo) + public async Task ExternalAndManuallyUserNoAsync(string deviceUniqueNo) { return await _devicePermissionService.ExternalAndManuallyUserNoAsync(deviceUniqueNo); } @@ -147,4 +147,11 @@ public class DevicePermissionsController : ControllerBase { return await _devicePermissionService.ResetVisitorsByDeviceAsync(deviceUniqueNo); } + + [HttpGet("exceptUsers")] + [IgnoreTenant] + public async Task> GetDeviceExceptUsersAsync(string deviceUniqueNo) + { + return await _devicePermissionService.GetDeviceExceptUsersAsync(deviceUniqueNo); + } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Response/DeviceOtherUserCountResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceOtherUserCountResponse.cs new file mode 100644 index 00000000..8a8922ae --- /dev/null +++ b/Src/Dlhis.Basic/Device/Response/DeviceOtherUserCountResponse.cs @@ -0,0 +1,14 @@ +namespace Dlhis.Basic.Device.Response; + +public class DeviceOtherUserCountResponse +{ + /// + /// 例外(手动单独分配) + /// + public int ManuallyUserCount { get; set; } + + /// + /// 访客 + /// + public int VisitorCount { 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 09833f35..a61d5f32 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -54,7 +54,10 @@ public interface IDevicePermissionService : IScopeDependency Task> GetDeviceUserCodesAsync(string deviceUniqueNo); - Task ExternalAndManuallyUserNoAsync(string deviceUniqueNo); + Task ExternalAndManuallyUserNoAsync(string deviceUniqueNo); Task ResetVisitorsByDeviceAsync(string deviceUniqueNo); + + + Task> GetDeviceExceptUsersAsync(string deviceUniqueNo); } \ 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 94ba3fba..76c74083 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -335,6 +335,31 @@ public class DevicePermissionService : IDevicePermissionService } + public async Task ResetVisitorsByDeviceAsync(string deviceUniqueNo) + { + var device = await _dbContext.Queryable().SingleAsync(x => x.UniqueNo == deviceUniqueNo); + device.ThrowIfNull("设备不存在"); + + var userNos = await GetDeviceUserNosFromVisitorAsync(device.Code); + var deviceTaskEntities = userNos.Select(x => new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Add, + DeviceType = device.Type, + UserId = null, + UserNo = x, + DeviceUniqueNo = device.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + Source = "手动下发设备中的访客人员", + Priority = 0, + TenantId = device.TenantId + }).ToList(); + + return await _dbContext.InsertAsync(deviceTaskEntities); + } + + //********************************************************************help methods******************************************************************************************** /// @@ -468,26 +493,53 @@ public class DevicePermissionService : IDevicePermissionService return ids.Distinct().ToList(); } - public async Task ExternalAndManuallyUserNoAsync(string deviceUniqueNo) + public async Task ExternalAndManuallyUserNoAsync(string deviceUniqueNo) { var device = await _dbContext.Queryable().SingleAsync(x => x.UniqueNo == deviceUniqueNo); device.ThrowIfNull("设备不存在"); - var devicePermissionManuallyUserNoCount = await _dbContext.Queryable() - .Where(x => SqlFunc.Subqueryable() - .Where(p => p.DeviceCode == device.Code) - .Where(p => p.UserNo == x.No).Any()) - .CountAsync(); + var devicePermissionManuallyUserNos = await GetManuallyDeviceUserNoAsync(device.Code); + var visitorUserNos = await GetDeviceUserNosFromVisitorAsync(device.Code); - var userNos = await GetDeviceUserNosFromVisitorAsync(device.Code); - - return new + return new DeviceOtherUserCountResponse { - ManuallyUserCount = devicePermissionManuallyUserNoCount, - VisitorCount = userNos.Count + ManuallyUserCount = devicePermissionManuallyUserNos.Count, + VisitorCount = visitorUserNos.Count }; } + public async Task> GetDeviceExceptUsersAsync(string deviceUniqueNo) + { + var device = await _dbContext.Queryable().SingleAsync(x => x.UniqueNo == deviceUniqueNo); + device.ThrowIfNull("设备不存在"); + + var userIds = await GetDeviceUserIdsAsync(deviceUniqueNo); + var userCodes = await _dbContext.Queryable() + .Where(x => userIds.Contains(x.Id)) + .Select(x => x.Code) + .ToListAsync(); + + var devicePermissionManuallyUserNos = await GetManuallyDeviceUserNoAsync(device.Code); + var visitorUserNos = await GetDeviceUserNosFromVisitorAsync(device.Code); + + var otherUserCodes = await _dbContext.Queryable() + .Where(x => devicePermissionManuallyUserNos.Contains(x.No) || visitorUserNos.Contains(x.No)) + .Select(x => x.Code) + .ToListAsync(); + + var existsUserCodes = userCodes.Concat(otherUserCodes).Distinct().ToList(); + + var deviceExistsUserCodes = await _dbContext.Queryable() + .Where(x => x.DeviceUniqueNo == deviceUniqueNo) + .Select(x => x.UserCode) + .ToListAsync(); + + //获取deviceExistsUserCodes不存在existsUserCodes的工号 + var toDeleteUserCodes = deviceExistsUserCodes.Except(existsUserCodes).ToList(); + return toDeleteUserCodes; + } + + public async Task> GetDeviceUserCodesAsync(string deviceUniqueNo) { var device = await _dbContext.Queryable().SingleAsync(x => x.UniqueNo == deviceUniqueNo); @@ -553,27 +605,13 @@ public class DevicePermissionService : IDevicePermissionService .ToList(); } - public async Task ResetVisitorsByDeviceAsync(string deviceUniqueNo) + private async Task> GetManuallyDeviceUserNoAsync(Guid deviceCode) { - var device = await _dbContext.Queryable().SingleAsync(x => x.UniqueNo == deviceUniqueNo); - device.ThrowIfNull("设备不存在"); - - var userNos = await GetDeviceUserNosFromVisitorAsync(device.Code); - var deviceTaskEntities = userNos.Select(x => new DeviceTaskEntity - { - Type = DeviceTaskEnumType.Add, - DeviceType = device.Type, - UserId = null, - UserNo = x, - DeviceUniqueNo = device.UniqueNo, - Status = DeviceTaskStatusEnumType.Wait, - Version = 0, - ResultMessage = null, - Source = "手动下发设备中的访客人员", - Priority = 0, - TenantId = device.TenantId - }).ToList(); - - return await _dbContext.InsertAsync(deviceTaskEntities); + return await _dbContext.Queryable() + .Where(x => SqlFunc.Subqueryable() + .Where(p => p.DeviceCode == deviceCode) + .Where(p => p.UserNo == x.No).Any()) + .Select(x => x.No) + .ToListAsync(); } } \ No newline at end of file