fix 优化获取设备状态数据

This commit is contained in:
2024-10-18 11:42:36 +08:00
parent 153a8f9341
commit 5d97795cfe

View File

@@ -230,41 +230,41 @@ public class DeviceService : IDeviceService
private async Task CheckUniqueNoExistsAsync(DeviceSaveRequest request) private async Task CheckUniqueNoExistsAsync(DeviceSaveRequest request)
{ {
await _dbContext.IgnoreAsync<ITenantId>(async () => await _dbContext.IgnoreAsync<ITenantId>(async () =>
{ {
var currentTenantId = _currentUser.GetStringTenantId(); var currentTenantId = _currentUser.GetStringTenantId();
//查询设备是否存在 //查询设备是否存在
var device = await _dbContext.Queryable<DeviceEntity>() var device = await _dbContext.Queryable<DeviceEntity>()
.Where(x => x.UniqueNo == request.UniqueNo) .Where(x => x.UniqueNo == request.UniqueNo)
.WhereIF(request.Id.HasValue, x => x.Id != request.Id) .WhereIF(request.Id.HasValue, x => x.Id != request.Id)
.SingleAsync(); .SingleAsync();
if (device != null) if (device != null)
{ {
(device.TenantId == currentTenantId).ThrowIfTrue("设备已经存在,请检查"); (device.TenantId == currentTenantId).ThrowIfTrue("设备已经存在,请检查");
var factory = device.TenantId; var factory = device.TenantId;
try try
{ {
var tenantResult = await _tenantApi.GetTenantByCodeAsync(device.TenantId); var tenantResult = await _tenantApi.GetTenantByCodeAsync(device.TenantId);
factory = tenantResult?.Data?.Name ?? string.Empty; factory = tenantResult?.Data?.Name ?? string.Empty;
} }
catch (Exception) catch (Exception)
{ {
//ignore //ignore
} }
true.ThrowIfTrue($"设备已添加{factory}厂区"); true.ThrowIfTrue($"设备已添加{factory}厂区");
} }
}); });
} }
/// <summary> /// <summary>
/// 获取离线设备 /// 获取离线设备
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
private async Task<List<DeviceEntity>> GetOfflineDevicesCount(List<DeviceEntity> devices) private async Task<List<long>> GetOfflineDevices(List<DeviceEntity> devices)
{ {
var now = DateTime.Now; var now = DateTime.Now;
@@ -281,23 +281,35 @@ public class DeviceService : IDeviceService
}) })
.ToListAsync(); .ToListAsync();
var onlineDevices = deviceRegistries.Where(x => var offlineUniqueNos = deviceRegistries
{ .Where(x => x.HeartbeatInterval > 0 && x.LastHeartbeatTime.AddSeconds(x.HeartbeatInterval) < now)
if (x.HeartbeatInterval <= 0) return true; .Select(x => x.UniqueNo);
return x.LastHeartbeatTime.AddSeconds(x.HeartbeatInterval) >= now;
})
.Select(x => new
{
x.UniqueNo
})
.ToList();
var onlineUniqueNos = new List<string>(); return devices.Where(x => offlineUniqueNos.Contains(x.UniqueNo)).Select(x => x.Id).ToList();
onlineDevices.ForEach(x => onlineUniqueNos.Add(x.UniqueNo)); }
var offUniqueNos = deviceUniqueNos.Except(onlineUniqueNos).ToList(); private async Task<List<long>> GetOnlineDevices(List<DeviceEntity> devices)
var list = devices.Where(x => offUniqueNos.Contains(x.UniqueNo)).ToList(); {
return list; var now = DateTime.Now;
var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList();
var deviceRegistries = await _dbContext.Queryable<DeviceRegistryEntity>()
.LeftJoin<DeviceEntity>((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<DeviceEntity>().Where(x => x.Type == DeviceTypeEnumType.Attendance).ToListAsync() ? await _dbContext.Queryable<DeviceEntity>().Where(x => x.Type == DeviceTypeEnumType.Attendance).ToListAsync()
: await _dbContext.Queryable<DeviceEntity>().Where(x => x.Type == DeviceTypeEnumType.Door).ToListAsync(); : await _dbContext.Queryable<DeviceEntity>().Where(x => x.Type == DeviceTypeEnumType.Door).ToListAsync();
var offDevices = await GetOfflineDevicesCount(devices); var ids = isOnline
//离线 ? await GetOnlineDevices(devices)
var ids = offDevices.Select(x => x.Id).ToList(); : await GetOfflineDevices(devices);
if (!isOnline)
{
ids = devices.Select(x => x.Id).Except(ids).ToList();
}
return await _dbContext.Queryable<DeviceEntity>() return await _dbContext.Queryable<DeviceEntity>()
.LeftJoin<DeviceTemplateEntity>((d, dt) => d.TemplateCode == dt.Code) .LeftJoin<DeviceTemplateEntity>((d, dt) => d.TemplateCode == dt.Code)