|
15 | 15 | import java.util.ArrayList; |
16 | 16 | import java.util.Arrays; |
17 | 17 | import java.util.Collections; |
| 18 | +import java.util.Comparator; |
18 | 19 | import java.util.Date; |
19 | 20 | import java.util.LinkedHashSet; |
20 | 21 | import java.util.List; |
21 | 22 | import java.util.Set; |
| 23 | +import java.util.stream.Collectors; |
22 | 24 |
|
23 | 25 | import static org.openmrs.module.labintegration.api.LabIntegrationReportsConstants.FREE_TEXT_RESULT_CONCEPT_ID; |
24 | 26 | import static org.openmrs.module.labintegration.api.LabIntegrationReportsConstants.TESTS_ORDERED_CONCEPT_ID; |
@@ -53,29 +55,66 @@ public List<Obs> getLabResults(Date startDate, Date endDate) { |
53 | 55 | startDate, endDate, false, null); |
54 | 56 |
|
55 | 57 | Set<Person> persons = new LinkedHashSet<>(orders.size()); |
56 | | - Set<Concept> orderedTests = new LinkedHashSet<>(orders.size()); |
57 | | - Set<Encounter> orderEncounters = new LinkedHashSet<>(orders.size()); |
| 58 | + Set<Concept> resultTests = new LinkedHashSet<>(orders.size()); |
| 59 | + Set<Encounter> resultEncounters = new LinkedHashSet<>(orders.size()); |
58 | 60 |
|
59 | 61 | for (Obs order : orders) { |
60 | 62 | persons.add(order.getPerson()); |
61 | | - orderedTests.add(order.getConcept()); |
62 | | - orderEncounters.add(order.getEncounter()); |
| 63 | + resultTests.add(order.getConcept()); |
| 64 | + resultEncounters.add(order.getEncounter()); |
63 | 65 | } |
64 | 66 |
|
65 | 67 | // freeTextResults are used to capture results with errors or other issues, so may not correspond |
66 | 68 | // directly to an ordered test |
67 | 69 | Concept freeTextResults = conceptService.getConcept(FREE_TEXT_RESULT_CONCEPT_ID); |
68 | 70 | if (freeTextResults != null) { |
69 | | - orderedTests.add(freeTextResults); |
| 71 | + resultTests.add(freeTextResults); |
| 72 | + } |
| 73 | + List<Obs> testResults = obsService.getObservations(new ArrayList<>(persons), new ArrayList<>(resultEncounters), |
| 74 | + new ArrayList<>(resultTests), null, null, null, Arrays.asList("obsDatetime desc", "obsId asc"), null, null, null, |
| 75 | + null, false); |
| 76 | + |
| 77 | + Set<Integer> resultEncounterIds = resultEncounters.stream().map(Encounter::getId).collect(Collectors.toSet()); |
| 78 | + |
| 79 | + // Unresulted Orders |
| 80 | + List<Obs> unresultedOrders = obsService.getObservations(null, null, Collections.singletonList(labOrderConcept), null, |
| 81 | + null, null, null, null, null, startDate, endDate, false, null); |
| 82 | + Set<Encounter> orderEncounters = new LinkedHashSet<>(unresultedOrders.size()); |
| 83 | + Set<Person> orderPersons = new LinkedHashSet<>(unresultedOrders.size()); |
| 84 | + for (Obs order : unresultedOrders) { |
| 85 | + if (!obsSelector.isValidTestType(order) || resultEncounterIds.contains(order.getEncounter().getId())) { |
| 86 | + continue; |
| 87 | + } |
| 88 | + |
| 89 | + orderPersons.add(order.getPerson()); |
| 90 | + orderEncounters.add(order.getEncounter()); |
70 | 91 | } |
71 | | - List<Obs> testResults = obsService.getObservations(new ArrayList<>(persons), new ArrayList<>(orderEncounters), |
72 | | - new ArrayList<>(orderedTests), null, null, null, Arrays.asList("obsDatetime desc", "obsId asc"), null, null, |
73 | | - null, null, false); |
| 92 | + |
| 93 | + List<Obs> orderResults = obsService.getObservations(new ArrayList<>(orderPersons), new ArrayList<>(orderEncounters), |
| 94 | + Collections.singletonList(labOrderConcept), null, null, null, Arrays.asList("obsDatetime desc", "obsId asc"), |
| 95 | + null, null, null, null, false); |
74 | 96 |
|
75 | 97 | if (testResults != null) { |
76 | | - return testResults; |
| 98 | + if (orderResults != null) { |
| 99 | + List<Obs> displayOrders = orderResults.stream().filter(o -> obsSelector.isValidTestType(o)) |
| 100 | + .map(o -> translateToDisplayResultTest(o)).collect(Collectors.toList()); |
| 101 | + testResults.addAll(displayOrders); |
| 102 | + } |
| 103 | + return testResults.stream().sorted(Comparator.comparing(Obs::getId)).collect(Collectors.toList()); |
77 | 104 | } |
78 | 105 |
|
79 | 106 | return Collections.emptyList(); |
80 | 107 | } |
| 108 | + |
| 109 | + private Obs translateToDisplayResultTest(Obs obs) { |
| 110 | + ConceptService conceptService = Context.getConceptService(); |
| 111 | + Obs displayResult = new Obs(); |
| 112 | + displayResult.setId(obs.getId()); |
| 113 | + displayResult.setPerson(obs.getPerson()); |
| 114 | + displayResult.setEncounter(obs.getEncounter()); |
| 115 | + displayResult.setConcept(conceptService.getConcept(obs.getValueCoded().getId())); |
| 116 | + displayResult.setObsDatetime(null); |
| 117 | + displayResult.setValueText(""); |
| 118 | + return displayResult; |
| 119 | + } |
81 | 120 | } |
0 commit comments