fix: finish all patient related upgrades

This commit is contained in:
voltsrage
2026-06-23 18:17:13 +08:00
parent 7751d6df06
commit 5d46200941
20 changed files with 985 additions and 19 deletions
@@ -191,21 +191,82 @@ public class EncounterService : IEncounterService
if (encounter is null)
throw new NotFoundException("Encounter not found.", "ENCOUNTER_NOT_FOUND");
var events = new List<object>();
events.Add(new
{
type = "status",
timestamp = encounter.AdmittedAt,
status = EncounterStatus.Active.ToDbString(),
label = "Patient admitted"
});
if (encounter.DischargedAt is not null)
{
events.Add(new
{
type = "status",
timestamp = encounter.DischargedAt.Value,
status = EncounterStatus.Discharged.ToDbString(),
label = "Patient discharged"
});
}
var observations = await _db.Observations
.Where(o => o.EncounterId == encounterId)
.OrderByDescending(o => o.RecordedAt)
.Select(o => new { type = "observation", timestamp = o.RecordedAt, o.ObservationCode, o.Value, o.Unit })
.Select(o => new
{
type = "observation",
timestamp = o.RecordedAt,
o.ObservationCode,
o.Value,
o.Unit
})
.ToListAsync();
events.AddRange(observations);
var alerts = await _db.ClinicalAlerts
.Where(a => a.EncounterId == encounterId)
.OrderByDescending(a => a.TriggeredAt)
.Select(a => new { type = "alert", timestamp = a.TriggeredAt, a.AlertType, a.Severity, a.Status })
.Select(a => new
{
type = "alert",
timestamp = a.TriggeredAt,
alertType = a.AlertType.ToString(),
severity = a.Severity.ToString(),
status = a.Status.ToString()
})
.ToListAsync();
events.AddRange(alerts);
var timeline = observations.Cast<object>()
.Concat(alerts.Cast<object>())
.OrderByDescending(x => (DateTimeOffset)((dynamic)x).timestamp)
var orders = await _db.Orders
.Where(o => o.EncounterId == encounterId)
.Select(o => new
{
type = "order",
timestamp = o.OrderedAt,
o.Description,
orderType = o.OrderType.ToString(),
status = o.Status.ToString()
})
.ToListAsync();
events.AddRange(orders);
var medications = await _db.MedicationAdministrations
.Where(m => m.EncounterId == encounterId)
.Select(m => new
{
type = "medication",
timestamp = m.AdministeredAt,
m.DrugName,
m.Dose,
m.DoseUnit,
m.Route
})
.ToListAsync();
events.AddRange(medications);
var timeline = events
.OrderByDescending(e => (DateTimeOffset)((dynamic)e).timestamp)
.ToList();
return new { encounterId, events = timeline };