88 lines
2.7 KiB
C#
88 lines
2.7 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
|
|
public class EncounterReadService : IEncounterReadService
|
|
{
|
|
private readonly GatewayDbContext _db;
|
|
|
|
public EncounterReadService(GatewayDbContext db) => _db = db;
|
|
|
|
public async Task<List<WardEncounterSummary>> ListActiveAsync(string? department)
|
|
{
|
|
var q = _db.Encounters
|
|
.Include(e => e.Patient)
|
|
.Where(e => e.Status == EncounterStatus.Active);
|
|
|
|
if (!string.IsNullOrEmpty(department))
|
|
{
|
|
var dept = DepartmentExtensions.FromDbString(department);
|
|
q = q.Where(e => e.Department == dept);
|
|
}
|
|
|
|
var encounters = await q
|
|
.OrderByDescending(e => e.AdmittedAt)
|
|
.ToListAsync();
|
|
|
|
if (encounters.Count == 0)
|
|
return [];
|
|
|
|
var encounterIds = encounters.Select(e => e.Id).ToList();
|
|
var openAlertCounts = await _db.ClinicalAlerts
|
|
.AsNoTracking()
|
|
.Where(a => encounterIds.Contains(a.EncounterId) && a.Status == AlertStatus.Open)
|
|
.GroupBy(a => a.EncounterId)
|
|
.Select(g => new { EncounterId = g.Key, Count = g.Count() })
|
|
.ToDictionaryAsync(x => x.EncounterId, x => x.Count);
|
|
|
|
return encounters.Select(e => new WardEncounterSummary(
|
|
e.Id,
|
|
e.Patient.Mrn,
|
|
e.Patient.FirstName,
|
|
e.Patient.LastName,
|
|
e.Department,
|
|
e.RoomBed,
|
|
e.AttendingPhysician,
|
|
e.AdmittedAt,
|
|
openAlertCounts.GetValueOrDefault(e.Id),
|
|
News2Score: null,
|
|
QsofaScore: null,
|
|
SepsisBundleStatus: null)).ToList();
|
|
}
|
|
|
|
public async Task<EncounterDetail?> GetByIdAsync(Guid id)
|
|
{
|
|
var enc = await _db.Encounters
|
|
.Include(e => e.Patient)
|
|
.AsNoTracking()
|
|
.FirstOrDefaultAsync(e => e.Id == id);
|
|
|
|
if (enc is null) return null;
|
|
|
|
var observations = await _db.Observations
|
|
.AsNoTracking()
|
|
.Where(o => o.EncounterId == id)
|
|
.OrderByDescending(o => o.RecordedAt)
|
|
.Take(10)
|
|
.ToListAsync();
|
|
|
|
var alerts = await _db.ClinicalAlerts
|
|
.AsNoTracking()
|
|
.Where(a => a.EncounterId == id && a.Status == AlertStatus.Open)
|
|
.OrderByDescending(a => a.TriggeredAt)
|
|
.ToListAsync();
|
|
|
|
return new EncounterDetail(
|
|
enc.Id,
|
|
enc.PatientId,
|
|
enc.Patient.Mrn,
|
|
enc.Patient.FirstName,
|
|
enc.Patient.LastName,
|
|
enc.Department,
|
|
enc.Status,
|
|
enc.RoomBed,
|
|
enc.AttendingPhysician,
|
|
enc.AdmittedAt,
|
|
observations,
|
|
alerts);
|
|
}
|
|
}
|