diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs index 332d1fcf..135ea0a1 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs @@ -230,41 +230,41 @@ public class DeviceService : IDeviceService private async Task CheckUniqueNoExistsAsync(DeviceSaveRequest request) { await _dbContext.IgnoreAsync(async () => - { - var currentTenantId = _currentUser.GetStringTenantId(); + { + var currentTenantId = _currentUser.GetStringTenantId(); - //查询设备是否存在 - var device = await _dbContext.Queryable() - .Where(x => x.UniqueNo == request.UniqueNo) - .WhereIF(request.Id.HasValue, x => x.Id != request.Id) - .SingleAsync(); + //查询设备是否存在 + var device = await _dbContext.Queryable() + .Where(x => x.UniqueNo == request.UniqueNo) + .WhereIF(request.Id.HasValue, x => x.Id != request.Id) + .SingleAsync(); - if (device != null) - { - (device.TenantId == currentTenantId).ThrowIfTrue("设备已经存在,请检查"); + if (device != null) + { + (device.TenantId == currentTenantId).ThrowIfTrue("设备已经存在,请检查"); - var factory = device.TenantId; - try - { - var tenantResult = await _tenantApi.GetTenantByCodeAsync(device.TenantId); - factory = tenantResult?.Data?.Name ?? string.Empty; - } - catch (Exception) - { - //ignore - } + var factory = device.TenantId; + try + { + var tenantResult = await _tenantApi.GetTenantByCodeAsync(device.TenantId); + factory = tenantResult?.Data?.Name ?? string.Empty; + } + catch (Exception) + { + //ignore + } - true.ThrowIfTrue($"设备已添加{factory}厂区"); - } - }); + true.ThrowIfTrue($"设备已添加{factory}厂区"); + } + }); } - + /// /// 获取离线设备 /// /// - private async Task> GetOfflineDevicesCount(List devices) + private async Task> GetOfflineDevices(List devices) { var now = DateTime.Now; @@ -281,23 +281,35 @@ public class DeviceService : IDeviceService }) .ToListAsync(); - var onlineDevices = deviceRegistries.Where(x => - { - if (x.HeartbeatInterval <= 0) return true; - return x.LastHeartbeatTime.AddSeconds(x.HeartbeatInterval) >= now; - }) - .Select(x => new - { - x.UniqueNo - }) - .ToList(); + var offlineUniqueNos = deviceRegistries + .Where(x => x.HeartbeatInterval > 0 && x.LastHeartbeatTime.AddSeconds(x.HeartbeatInterval) < now) + .Select(x => x.UniqueNo); - var onlineUniqueNos = new List(); - onlineDevices.ForEach(x => onlineUniqueNos.Add(x.UniqueNo)); + return devices.Where(x => offlineUniqueNos.Contains(x.UniqueNo)).Select(x => x.Id).ToList(); + } - var offUniqueNos = deviceUniqueNos.Except(onlineUniqueNos).ToList(); - var list = devices.Where(x => offUniqueNos.Contains(x.UniqueNo)).ToList(); - return list; + private async Task> GetOnlineDevices(List devices) + { + var now = DateTime.Now; + + var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList(); + + var deviceRegistries = await _dbContext.Queryable() + .LeftJoin((x, d) => x.DeviceUniqueNo == d.UniqueNo) + .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) + .Select((x, d) => new + { + d.UniqueNo, + d.HeartbeatInterval, + x.LastHeartbeatTime + }) + .ToListAsync(); + + var offlineUniqueNos = deviceRegistries + .Where(x => x.HeartbeatInterval <= 0 || x.LastHeartbeatTime.AddSeconds(x.HeartbeatInterval) >= now) + .Select(x => x.UniqueNo); + + return devices.Where(x => offlineUniqueNos.Contains(x.UniqueNo)).Select(x => x.Id).ToList(); } @@ -314,13 +326,9 @@ public class DeviceService : IDeviceService ? await _dbContext.Queryable().Where(x => x.Type == DeviceTypeEnumType.Attendance).ToListAsync() : await _dbContext.Queryable().Where(x => x.Type == DeviceTypeEnumType.Door).ToListAsync(); - var offDevices = await GetOfflineDevicesCount(devices); - //离线 - var ids = offDevices.Select(x => x.Id).ToList(); - if (!isOnline) - { - ids = devices.Select(x => x.Id).Except(ids).ToList(); - } + var ids = isOnline + ? await GetOnlineDevices(devices) + : await GetOfflineDevices(devices); return await _dbContext.Queryable() .LeftJoin((d, dt) => d.TemplateCode == dt.Code)