fix errors of Degraded Operations Visibility

This commit is contained in:
voltsrage
2026-06-24 00:46:27 +08:00
parent 4399996448
commit 2e80700bf0
7 changed files with 177 additions and 40 deletions
@@ -80,7 +80,7 @@ public class SofaScoringService : BackgroundService
evt.PatientId,
evt.ObservationCode,
evt.Value,
DateTimeOffset.UtcNow,
evt.RecordedAt == default ? DateTimeOffset.UtcNow : evt.RecordedAt,
stoppingToken);
if (outcome.Outcome == SofaOutcome.EncounterNotFound)
@@ -3,4 +3,5 @@ public record News2ObservationEvent(
Guid EncounterId,
Guid PatientId,
string ObservationCode,
decimal Value);
decimal Value,
DateTimeOffset RecordedAt);
@@ -16,34 +16,39 @@ public class OperationsService : IOperationsService
public async Task<IReadOnlyList<GatewayFleetItem>> GetGatewayFleetAsync(
GatewayFleetFilter filter, CancellationToken ct)
{
await using var conn = new NpgsqlConnection(_db.Database.GetConnectionString());
await conn.OpenAsync(ct);
var query = _db.WardGateways
.AsNoTracking()
.Include(g => g.Site)
.AsQueryable();
const string sql = """
SELECT
g.id,
g.gateway_code AS GatewayCode,
g.department AS Department,
s.site_code AS SiteCode,
s.name AS SiteName,
g.status AS Status,
g.reported_buffer_depth AS ReportedBufferDepth,
g.last_heartbeat_at AS LastHeartbeatAt,
g.last_sync_at AS LastSyncAt,
EXTRACT(EPOCH FROM (NOW() - g.last_heartbeat_at)) / 60 AS MinutesSinceHeartbeat
FROM ward_gateways g
JOIN clinical_sites s ON s.id = g.site_id
WHERE (@Status IS NULL OR g.status = @Status)
AND (@SiteId IS NULL OR g.site_id = @SiteId)
ORDER BY g.status DESC, MinutesSinceHeartbeat DESC NULLS LAST
""";
var rows = await conn.QueryAsync<GatewayFleetItem>(sql, new
if (!string.IsNullOrEmpty(filter.Status))
{
Status = filter.Status,
SiteId = filter.SiteId
});
return rows.ToList();
var status = GatewayStatusExtensions.FromDbString(filter.Status);
query = query.Where(g => g.Status == status);
}
if (filter.SiteId is Guid siteId)
query = query.Where(g => g.SiteId == siteId);
var now = DateTimeOffset.UtcNow;
return await query
.OrderByDescending(g => g.Status)
.ThenByDescending(g => g.LastHeartbeatAt == null)
.ThenByDescending(g => g.LastHeartbeatAt)
.Select(g => new GatewayFleetItem(
g.Id,
g.GatewayCode,
g.Department,
g.Site.SiteCode,
g.Site.Name,
g.Status.ToDbString(),
g.ReportedBufferDepth,
g.LastHeartbeatAt,
g.LastSyncAt,
g.LastHeartbeatAt == null
? null
: (double?)(now - g.LastHeartbeatAt.Value).TotalMinutes))
.ToListAsync(ct);
}
public async Task<GatewayDetailResponse> GetGatewayDetailAsync(Guid gatewayId, CancellationToken ct)