public Patient GetPatient(string mrn, string assigningAuthority, bool createIfNotExist) { Platform.CheckForEmptyString(mrn, "mrn"); Platform.CheckForEmptyString(assigningAuthority, "assigningAuthority"); var infoAuth = _persistenceContext.GetBroker <IEnumBroker>().TryFind <InformationAuthorityEnum>(assigningAuthority); Patient patient = null; var criteria = new PatientProfileSearchCriteria(); criteria.Mrn.Id.EqualTo(mrn); criteria.Mrn.AssigningAuthority.EqualTo(infoAuth); try { var profile = _persistenceContext.GetBroker <IPatientProfileBroker>().FindOne(criteria); patient = profile.Patient; _patients.Add(new LockableEntity <Patient>(patient, DirtyState.Dirty)); } catch (EntityNotFoundException) { if (createIfNotExist) { patient = new Patient(); _patients.Add(new LockableEntity <Patient>(patient, DirtyState.New)); var profile = new PatientProfile { Mrn = { Id = mrn, AssigningAuthority = infoAuth } }; patient.AddProfile(profile); } } return(patient); }
public IList <PatientProfileMatch> FindReconciliationMatches(PatientProfile targetProfile, IPersistenceContext context) { /* User needs to resort to manual linking of patient records from multiple HIS when automatic MPI fails. * * Allow user to to select 2 or more patient records from different hospitals and merge into an MPI. * * Display High-Probability match/search results from muliple HIS of patients with various Mrns when * field: healthcard # is matched/identical. * * Display Moderate-Probability match/search results from multiple HIS of patients with various Mrns when fields: surname, * given name, DOB, gender are matched/identical. * */ IPatientProfileBroker broker = context.GetBroker <IPatientProfileBroker>(); IList <PatientProfileMatch> matches = new List <PatientProfileMatch>(); IList <PatientProfileMatch> highMatches = new List <PatientProfileMatch>(); if (targetProfile.Healthcard != null && !string.IsNullOrEmpty(targetProfile.Healthcard.Id)) { PatientProfileSearchCriteria high = new PatientProfileSearchCriteria(); high.Healthcard.Id.EqualTo(targetProfile.Healthcard.Id); highMatches = PatientProfileMatch.CreateList(targetProfile, broker.Find(high), PatientProfileMatch.ScoreValue.High); } PatientProfileSearchCriteria moderateViaName = new PatientProfileSearchCriteria(); if (targetProfile.Name.FamilyName != null && !string.IsNullOrEmpty(targetProfile.Name.FamilyName)) { moderateViaName.Name.FamilyName.EqualTo(targetProfile.Name.FamilyName); } if (targetProfile.Name.GivenName != null && !string.IsNullOrEmpty(targetProfile.Name.GivenName)) { moderateViaName.Name.GivenName.EqualTo(targetProfile.Name.GivenName); } if (targetProfile.DateOfBirth != null) { moderateViaName.DateOfBirth.EqualTo(targetProfile.DateOfBirth); } moderateViaName.Sex.EqualTo(targetProfile.Sex); IList <PatientProfileMatch> moderateMatchesViaName = PatientProfileMatch.CreateList(targetProfile, broker.Find(moderateViaName), PatientProfileMatch.ScoreValue.Moderate); matches = PatientProfileMatch.Combine(highMatches, moderateMatchesViaName); RemoveConflicts(targetProfile.Patient, matches); return(matches); }
private List <OrderNoteboxItem> BuildOrderNoteboxItems(List <NoteboxItem> inboxItems) { if (inboxItems.Count == 0) { return(new List <OrderNoteboxItem>()); } // Get all the patients for all the items var patients = CollectionUtils.Unique(CollectionUtils.Map <NoteboxItem, Patient>(inboxItems, item => item.Patient)); var patientQuery = new HqlProjectionQuery(new HqlFrom(typeof(PatientProfile).Name, "pp")); var patientCriteria = new PatientProfileSearchCriteria(); patientCriteria.Patient.In(patients); patientQuery.Conditions.AddRange(HqlCondition.FromSearchCriteria("pp", patientCriteria)); var profiles = ExecuteHql <PatientProfile>(patientQuery); // Have to manually get the postings (and later their recipients) to work around a Hibernate fetch="subselect" issue. // The subselect somehow removed the "top(100)" and "order by" clause. Making the query slow. // Load all the postings for all the notes. There may be more than one postings per orderNote. // Therefore it is inappropriate to just use the postings in the base query. var notes = CollectionUtils.Unique(CollectionUtils.Map <NoteboxItem, Note>(inboxItems, item => item.Note)); var postingQuery = new HqlProjectionQuery(new HqlFrom(typeof(NotePosting).Name, "np")); var postingCriteria = new NotePostingSearchCriteria(); postingCriteria.Note.In(notes); postingQuery.Conditions.AddRange(HqlCondition.FromSearchCriteria("np", postingCriteria)); postingQuery.Froms[0].Joins.Add(new HqlJoin("np.Recipient", null, HqlJoinMode.Left, true)); var postings = ExecuteHql <NotePosting>(postingQuery); // Build order notebox items var orderNoteboxItems = CollectionUtils.Map(inboxItems, delegate(NoteboxItem item) { // Find the appropriate patient profile based on OrderingFacility var profile = CollectionUtils.SelectFirst(profiles, pp => pp.Patient.Equals(item.Patient) && pp.Mrn.AssigningAuthority.Code.Equals(item.OrderingFacilityInformationAuthority.Code)); // Find all the recipients var postingsForThisNote = CollectionUtils.Select(postings, np => np.Note.Equals(item.Note)); var recipients = CollectionUtils.Map <NotePosting, object>(postingsForThisNote, posting => posting is StaffNotePosting ? (object)((StaffNotePosting)posting).Recipient : (object)((GroupNotePosting)posting).Recipient); return(new OrderNoteboxItem(item.Note, item.Order, item.Patient, profile, item.Author, recipients, item.DiagnosticServiceName, item.NotePostingAcknowledged)); }); return(orderNoteboxItems); }
public IList<PatientProfileMatch> FindReconciliationMatches(PatientProfile targetProfile, IPersistenceContext context) { /* User needs to resort to manual linking of patient records from multiple HIS when automatic MPI fails. * * Allow user to to select 2 or more patient records from different hospitals and merge into an MPI. * * Display High-Probability match/search results from muliple HIS of patients with various Mrns when * field: healthcard # is matched/identical. * * Display Moderate-Probability match/search results from multiple HIS of patients with various Mrns when fields: surname, * given name, DOB, gender are matched/identical. * */ IPatientProfileBroker broker = context.GetBroker<IPatientProfileBroker>(); IList<PatientProfileMatch> matches = new List<PatientProfileMatch>(); IList<PatientProfileMatch> highMatches = new List<PatientProfileMatch>(); if (targetProfile.Healthcard != null && !string.IsNullOrEmpty(targetProfile.Healthcard.Id)) { PatientProfileSearchCriteria high = new PatientProfileSearchCriteria(); high.Healthcard.Id.EqualTo(targetProfile.Healthcard.Id); highMatches = PatientProfileMatch.CreateList(targetProfile, broker.Find(high), PatientProfileMatch.ScoreValue.High); } PatientProfileSearchCriteria moderateViaName = new PatientProfileSearchCriteria(); if (targetProfile.Name.FamilyName != null && !string.IsNullOrEmpty(targetProfile.Name.FamilyName)) moderateViaName.Name.FamilyName.EqualTo(targetProfile.Name.FamilyName); if (targetProfile.Name.GivenName != null && !string.IsNullOrEmpty(targetProfile.Name.GivenName)) moderateViaName.Name.GivenName.EqualTo(targetProfile.Name.GivenName); if (targetProfile.DateOfBirth != null) moderateViaName.DateOfBirth.EqualTo(targetProfile.DateOfBirth); moderateViaName.Sex.EqualTo(targetProfile.Sex); IList<PatientProfileMatch> moderateMatchesViaName = PatientProfileMatch.CreateList(targetProfile, broker.Find(moderateViaName), PatientProfileMatch.ScoreValue.Moderate); matches = PatientProfileMatch.Combine(highMatches, moderateMatchesViaName); RemoveConflicts(targetProfile.Patient, matches); return matches; }
public IList <PatientProfile> ListPatientProfiles(PatientProfileSearchCriteria criteria) { IPatientProfileBroker profileBroker = this.CurrentContext.GetBroker <IPatientProfileBroker>(); return(profileBroker.Find(criteria)); }
public IList<PatientProfile> ListPatientProfiles(PatientProfileSearchCriteria criteria) { IPatientProfileBroker profileBroker = this.CurrentContext.GetBroker<IPatientProfileBroker>(); return profileBroker.Find(criteria); }
private List<OrderNoteboxItem> BuildOrderNoteboxItems(List<NoteboxItem> inboxItems) { if (inboxItems.Count == 0) return new List<OrderNoteboxItem>(); // Get all the patients for all the items var patients = CollectionUtils.Unique(CollectionUtils.Map<NoteboxItem, Patient>(inboxItems, item => item.Patient)); var patientQuery = new HqlProjectionQuery(new HqlFrom(typeof(PatientProfile).Name, "pp")); var patientCriteria = new PatientProfileSearchCriteria(); patientCriteria.Patient.In(patients); patientQuery.Conditions.AddRange(HqlCondition.FromSearchCriteria("pp", patientCriteria)); var profiles = ExecuteHql<PatientProfile>(patientQuery); // Have to manually get the postings (and later their recipients) to work around a Hibernate fetch="subselect" issue. // The subselect somehow removed the "top(100)" and "order by" clause. Making the query slow. // Load all the postings for all the notes. There may be more than one postings per orderNote. // Therefore it is inappropriate to just use the postings in the base query. var notes = CollectionUtils.Unique(CollectionUtils.Map<NoteboxItem, Note>(inboxItems, item => item.Note)); var postingQuery = new HqlProjectionQuery(new HqlFrom(typeof(NotePosting).Name, "np")); var postingCriteria = new NotePostingSearchCriteria(); postingCriteria.Note.In(notes); postingQuery.Conditions.AddRange(HqlCondition.FromSearchCriteria("np", postingCriteria)); postingQuery.Froms[0].Joins.Add(new HqlJoin("np.Recipient", null, HqlJoinMode.Left, true)); var postings = ExecuteHql<NotePosting>(postingQuery); // Build order notebox items var orderNoteboxItems = CollectionUtils.Map(inboxItems, delegate(NoteboxItem item) { // Find the appropriate patient profile based on OrderingFacility var profile = CollectionUtils.SelectFirst(profiles, pp => pp.Patient.Equals(item.Patient) && pp.Mrn.AssigningAuthority.Code.Equals(item.OrderingFacilityInformationAuthority.Code)); // Find all the recipients var postingsForThisNote = CollectionUtils.Select(postings, np => np.Note.Equals(item.Note)); var recipients = CollectionUtils.Map<NotePosting, object>(postingsForThisNote, posting => posting is StaffNotePosting ? (object)((StaffNotePosting)posting).Recipient : (object)((GroupNotePosting)posting).Recipient); return new OrderNoteboxItem(item.Note, item.Order, item.Patient, profile, item.Author, recipients, item.DiagnosticServiceName, item.NotePostingAcknowledged); }); return orderNoteboxItems; }