From 0520aa7d4233baddf6b995551cb5604c4924915a Mon Sep 17 00:00:00 2001 From: mherman22 Date: Mon, 2 Sep 2024 22:08:57 +0300 Subject: [PATCH] ensure search by other attributes aswell --- .../provider/PatientSearchRestController.java | 62 ++++++++++++------- .../service/FhirTransformServiceImpl.java | 18 +++--- 2 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/openelisglobal/common/rest/provider/PatientSearchRestController.java b/src/main/java/org/openelisglobal/common/rest/provider/PatientSearchRestController.java index 40101dfc2..ffabc8885 100644 --- a/src/main/java/org/openelisglobal/common/rest/provider/PatientSearchRestController.java +++ b/src/main/java/org/openelisglobal/common/rest/provider/PatientSearchRestController.java @@ -109,7 +109,8 @@ public PatientSearchResultsForm getPatientResults(HttpServletRequest request, } if (request.getParameter("crResult") != null && request.getParameter("crResult").contains("true")) { - List fhirResults = searchPatientInClientRegistry(nationalID); + List fhirResults = searchPatientInClientRegistry(lastName, firstName, STNumber, + subjectNumber, nationalID, null, guid, dateOfBirth, gender); results.addAll(fhirResults); } @@ -171,7 +172,8 @@ private List parseCRPatientSearchResults(Bundle p .map(entry -> (org.hl7.fhir.r4.model.Patient) entry.getResource()).collect(Collectors.toList()); } - private List searchPatientInClientRegistry(String nationalID) { + private List searchPatientInClientRegistry(String lastName, String firstName, String STNumber, + String subjectNumber, String nationalID, String patientID, String guid, String dateOfBirth, String gender) { if (isClientRegistryConfigInvalid()) { return new ArrayList<>(); } @@ -179,44 +181,60 @@ private List searchPatientInClientRegistry(String national IGenericClient clientRegistry = fhirUtil.getFhirClient(fhirConfig.getClientRegistryServerUrl(), fhirConfig.getClientRegistryUserName(), fhirConfig.getClientRegistryPassword()); - Patient patient = patientService.getPatientByNationalId(nationalID); + List patientSearchResults = searchResultsService.getSearchResults(lastName, firstName, + STNumber, subjectNumber, nationalID, null, patientID, guid, dateOfBirth, gender); + + List finalResults = new ArrayList<>(); + + for (PatientSearchResults patientSearchResult : patientSearchResults) { + List crIdentifiers = fetchCRIdentifiers(clientRegistry, patientSearchResult); + + if (!crIdentifiers.isEmpty()) { + List externalPatients = fetchExternalPatients(clientRegistry, + crIdentifiers); + + Patient openelis = patientService.getPatientByNationalId(patientSearchResult.getNationalId()); + for (org.hl7.fhir.r4.model.Patient externalPatient : externalPatients) { + Patient openElisPatient = SpringContext.getBean(FhirTransformService.class) + .transformToOpenElisPatient(openelis, externalPatient); + PatientSearchResults searchResult = getSearchResultsForPatient(openElisPatient, null); + searchResult.setDataSourceName(MessageUtil.getMessage("patient.cr.source")); + finalResults.add(searchResult); + } + } + } + + return finalResults; + } + + private List fetchCRIdentifiers(IGenericClient clientRegistry, PatientSearchResults patientSearchResult) { List targetSystems = targetSystemsParam == null ? Collections.emptyList() : targetSystemsParam.getValuesAsQueryTokens().stream().filter(Objects::nonNull) .map(StringParam::getValue).collect(Collectors.toList()); - // construct request to external fhir client + // Construct request to external FHIR client IOperationUntypedWithInputAndPartialOutput identifiersRequest = clientRegistry.operation() .onType("Patient").named("$ihe-pix").withSearchParameter(Parameters.class, "sourceIdentifier", - new TokenParam("http://openelis-global.org/pat_nationalId", patient.getNationalId())); + new TokenParam("http://openelis-global.org/pat_nationalId", + patientSearchResult.getNationalId())); if (!targetSystems.isEmpty()) { identifiersRequest.andSearchParameter("targetSystem", new StringParam(String.join(",", targetSystems))); } Parameters crMatchingParams = identifiersRequest.useHttpGet().execute(); - List crIdentifiers = crMatchingParams.getParameter().stream() - .filter(param -> Objects.equals(param.getName(), "targetId")) - .map(param -> ((Reference) param.getValue()).getReference()).collect(Collectors.toList()); - if (crIdentifiers.isEmpty()) { - return new ArrayList<>(); - } + return crMatchingParams.getParameter().stream().filter(param -> Objects.equals(param.getName(), "targetId")) + .map(param -> ((Reference) param.getValue()).getReference()).collect(Collectors.toList()); + } + private List fetchExternalPatients(IGenericClient clientRegistry, + List crIdentifiers) { Bundle patientBundle = clientRegistry.search().forResource(org.hl7.fhir.r4.model.Patient.class) .where(new StringClientParam(org.hl7.fhir.r4.model.Patient.SP_RES_ID).matches().values(crIdentifiers)) .returnBundle(Bundle.class).execute(); - List externalPatients = parseCRPatientSearchResults(patientBundle); - List results = new ArrayList<>(); - - for (org.hl7.fhir.r4.model.Patient externalPatient : externalPatients) { - Patient openElisPatient = SpringContext.getBean(FhirTransformService.class).transformToOpenElisPatient(patient, externalPatient); - PatientSearchResults searchResult = getSearchResultsForPatient(openElisPatient, null); - searchResult.setDataSourceName(MessageUtil.getMessage("patient.cr.source")); - results.add(searchResult); - } - - return results; + return parseCRPatientSearchResults(patientBundle); } private boolean isClientRegistryConfigInvalid() { diff --git a/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirTransformServiceImpl.java b/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirTransformServiceImpl.java index 495df395d..abe8bea8d 100644 --- a/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirTransformServiceImpl.java +++ b/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirTransformServiceImpl.java @@ -721,15 +721,15 @@ public Patient transformToOpenElisPatient(Patient openELISPatient, org.hl7.fhir. } switch (fhirPatient.getGender()) { - case MALE: - openELISPatient.setGender("M"); - break; - case FEMALE: - openELISPatient.setGender("F"); - break; - default: - openELISPatient.setGender(null); - break; + case MALE: + openELISPatient.setGender("M"); + break; + case FEMALE: + openELISPatient.setGender("F"); + break; + default: + openELISPatient.setGender(null); + break; } if (fhirPatient.getBirthDate() != null) {