No SOFA trend chart or organ-system timeline
No GCS trend chart or component history
No qSOFA history view
This commit is contained in:
voltsrage
2026-06-23 18:00:43 +08:00
parent 729c19830c
commit 7751d6df06
30 changed files with 3866 additions and 41 deletions
+52 -1
View File
@@ -83,13 +83,64 @@ public class QsofaDetector
var values = await cache.StringGetAsync(allKeys);
var activeCount = QsofaCalculator.CountActiveCriteria(values);
var created = activeCount >= 2
&& await TryCreateScreenAlertAsync(encounterId, patientId, activeCount, values, ct);
await PersistEvaluationIfChangedAsync(
encounterId, patientId, activeCount, values, created, ct);
if (activeCount < 2)
return QsofaResult.InsufficientCriteria(activeCount);
var created = await TryCreateScreenAlertAsync(encounterId, patientId, activeCount, values, ct);
return created ? QsofaResult.AlertCreated : QsofaResult.AlertAlreadyOpen;
}
private async Task PersistEvaluationIfChangedAsync(
Guid encounterId,
Guid patientId,
int activeCount,
RedisValue[] values,
bool screenAlertFired,
CancellationToken ct)
{
using var scope = _services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var last = await db.QsofaEvaluations
.AsNoTracking()
.Where(e => e.EncounterId == encounterId)
.OrderByDescending(e => e.EvaluatedAt)
.ThenByDescending(e => e.Id)
.Select(e => new { e.ActiveCriteria, e.ScreenAlertFired })
.FirstOrDefaultAsync(ct);
if (last is not null
&& last.ActiveCriteria == activeCount
&& !screenAlertFired)
{
return;
}
var criteria = QsofaCalculator.ParseCriteriaState(values);
var evaluatedAt = DateTimeOffset.UtcNow;
db.QsofaEvaluations.Add(new QsofaEvaluation
{
Id = Guid.NewGuid(),
EncounterId = encounterId,
PatientId = patientId,
ActiveCriteria = activeCount,
RespRate = criteria.RespRate,
SystolicBp = criteria.SystolicBp,
Avpu = criteria.Avpu,
ScreenAlertFired = screenAlertFired,
EvaluatedAt = evaluatedAt,
CreatedAt = evaluatedAt,
});
await db.SaveChangesAsync(ct);
}
private async Task<bool> TryCreateScreenAlertAsync(
Guid encounterId,
Guid patientId,