diff --git a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/contract/LabOrderResult.java b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/contract/LabOrderResult.java index 0a23a2c7f9..0b132f413f 100644 --- a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/contract/LabOrderResult.java +++ b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/contract/LabOrderResult.java @@ -232,4 +232,166 @@ public String getPreferredPanelName() { public void setPreferredPanelName(String preferredPanelName) { this.preferredPanelName = preferredPanelName; } + + public static class Builder { + + private String orderUuid; + private String action; + private String accessionUuid; + private String testName; + private String testUnitOfMeasurement; + private Double minNormal; + private Double maxNormal; + private Date accessionDateTime; + private List accessionNotes; + private String uploadedFileName; + private Boolean referredOut; + private Boolean abnormal; + private String result; + private String preferredTestName; + private String notes; + private Date resultDateTime; + private String testUuid; + private String providerName; + private Date vsiitStartTime; + private String panelName; + private String panelUuid; + private String preferredPanelName; + + public Builder order(String orderUuid) { + this.orderUuid = orderUuid; + return this; + } + + public Builder action(String action) { + this.action = action; + return this; + } + public Builder accession(String accessionUuid) { + this.accessionUuid = accessionUuid; + return this; + } + + public Builder testName(String testName) { + this.testName = testName; + return this; + } + + public Builder uom(String uom) { + this.testUnitOfMeasurement = uom; + return this; + } + + public Builder minNormal(Double minNormal) { + this.minNormal = minNormal; + return this; + } + + public Builder maxNormal(Double maxNormal) { + this.maxNormal = maxNormal; + return this; + } + + public Builder accessionDateTime(Date accessionDateTime) { + this.accessionDateTime = accessionDateTime; + return this; + } + + public Builder result(String result) { + this.result = result; + return this; + } + + public Builder abnormal(Boolean abnormal) { + this.abnormal = abnormal; + return this; + } + + public Builder referredOut(Boolean referredOut) { + this.referredOut = referredOut; + return this; + } + + public Builder uploadedFileName(String uploadedFileName) { + this.uploadedFileName = uploadedFileName; + return this; + } + + public Builder accessionNotes(List accessionNotes) { + this.accessionNotes = accessionNotes; + return this; + } + + public LabOrderResult build() { + LabOrderResult labOrderResult = new LabOrderResult(); + labOrderResult.setOrderUuid(orderUuid); + labOrderResult.setAction(action); + labOrderResult.setTestName(testName); + labOrderResult.setTestUuid(testUuid); + labOrderResult.setResult(result); + labOrderResult.setTestUnitOfMeasurement(testUnitOfMeasurement); + labOrderResult.setAccessionUuid(accessionUuid); + labOrderResult.setAccessionDateTime(accessionDateTime); + labOrderResult.setAccessionNotes(accessionNotes); + labOrderResult.setMinNormal(minNormal); + labOrderResult.setMaxNormal(maxNormal); + labOrderResult.setAbnormal(abnormal); + labOrderResult.setReferredOut(referredOut); + labOrderResult.setUploadedFileName(uploadedFileName); + labOrderResult.setPreferredTestName(preferredTestName); + labOrderResult.setNotes(notes); + labOrderResult.setResultDateTime(resultDateTime); + labOrderResult.setProvider(providerName); + labOrderResult.setVisitStartTime(vsiitStartTime); + labOrderResult.setPanelName(panelName); + labOrderResult.setPreferredPanelName(preferredPanelName); + labOrderResult.setPanelUuid(panelUuid); + return labOrderResult; + } + + public Builder preferredTestName(String preferredTestName) { + this.preferredTestName = preferredTestName; + return this; + } + + public Builder notes(String notes) { + this.notes = notes; + return this; + } + + public Builder resultDateTime(Date resultDateTime) { + this.resultDateTime = resultDateTime; + return this; + } + + public Builder testUuid(String testUuid) { + this.testUuid = testUuid; + return this; + } + + public Builder provider(String providerName) { + this.providerName = providerName; + return this; + } + + public Builder visitStartTime(Date vsiitStartTime) { + this.vsiitStartTime = vsiitStartTime; + return this; + } + + public Builder panelName(String panelName) { + this.panelName = panelName; + return this; + } + + public Builder panelUuid(String panelUuid) { + this.panelUuid = panelUuid; + return this; + } + + public Builder preferredPanelName(String preferredPanelName) { + this.preferredPanelName = preferredPanelName; + return this; + } + } } diff --git a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsService.java b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsService.java index 09cbb0a45e..9f40d9bd6f 100644 --- a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsService.java +++ b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsService.java @@ -1,5 +1,7 @@ package org.openmrs.module.bahmniemrapi.laborder.service; +import org.openmrs.Obs; +import org.openmrs.Order; import org.openmrs.Patient; import org.openmrs.Visit; import org.openmrs.module.bahmniemrapi.laborder.contract.LabOrderResult; @@ -13,4 +15,6 @@ public interface LabOrderResultsService { LabOrderResults getAll(Patient patient, List visits, int numberOfAccessions); List getAllForConcepts(Patient patient, Collection concepts, List visits, Date startDate, Date endDate); + + List resultsForOrders(List orders, List obsList, Integer numberOfAccessions); } diff --git a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsServiceImpl.java b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsServiceImpl.java index 6017956bb3..e91c781b5e 100644 --- a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsServiceImpl.java +++ b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/service/LabOrderResultsServiceImpl.java @@ -1,5 +1,7 @@ package org.openmrs.module.bahmniemrapi.laborder.service; +import org.openmrs.Concept; +import org.openmrs.ConceptNumeric; import org.openmrs.Encounter; import org.openmrs.EncounterProvider; import org.openmrs.Obs; @@ -8,7 +10,9 @@ import org.openmrs.Provider; import org.openmrs.TestOrder; import org.openmrs.Visit; +import org.openmrs.api.ConceptService; import org.openmrs.api.EncounterService; +import org.openmrs.api.context.Context; import org.openmrs.api.db.hibernate.HibernateUtil; import org.openmrs.module.bahmniemrapi.accessionnote.contract.AccessionNote; import org.openmrs.module.bahmniemrapi.laborder.contract.LabOrderResult; @@ -20,13 +24,17 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; @Service @@ -35,6 +43,7 @@ public class LabOrderResultsServiceImpl implements LabOrderResultsService { public static final String LAB_MINNORMAL = "LAB_MINNORMAL"; public static final String LAB_MAXNORMAL = "LAB_MAXNORMAL"; public static final String LAB_NOTES = "LAB_NOTES"; + public static final String LAB_RESULT = "LAB_RESULT"; private static final String REFERRED_OUT = "REFERRED_OUT"; public static final String LAB_REPORT = "LAB_REPORT"; private static final String VALIDATION_NOTES_ENCOUNTER_TYPE = "VALIDATION NOTES"; @@ -49,6 +58,9 @@ public class LabOrderResultsServiceImpl implements LabOrderResultsService { @Autowired private OrderMapper orderMapper; + @Autowired + private ConceptService conceptService; + @Override @Transactional(readOnly = true) public LabOrderResults getAll(Patient patient, List visits, int numberOfAccessions) { @@ -85,6 +97,180 @@ public LabOrderResults getAll(Patient patient, List visits, int numberOfA return new LabOrderResults(filterLabOrderResults(labOrderResults)); } + public enum TestAttribute { + ABNORMAL, + MIN_NORMAL, + MAX_NORMAL, + REFERRED_OUT, + LAB_REPORT, + LAB_NOTES, + LAB_RESULT + } + + @Override + public List resultsForOrders(List orders, List obsForOrders, Integer numberOfAccessions) { + if (orders.isEmpty()) { + return Collections.emptyList(); + } + + Map testAttributeConceptMap = new HashMap<>(); + testAttributeConceptMap.put(TestAttribute.ABNORMAL, Optional.ofNullable(conceptService.getConceptByName(LAB_ABNORMAL)).map(concept -> concept.getConceptId()).orElse(null)); + testAttributeConceptMap.put(TestAttribute.MIN_NORMAL, Optional.ofNullable(conceptService.getConceptByName(LAB_MINNORMAL)).map(concept -> concept.getConceptId()).orElse(null)); + testAttributeConceptMap.put(TestAttribute.MAX_NORMAL, Optional.ofNullable(conceptService.getConceptByName(LAB_MAXNORMAL)).map(concept -> concept.getConceptId()).orElse(null)); + testAttributeConceptMap.put(TestAttribute.REFERRED_OUT, Optional.ofNullable(conceptService.getConceptByName(REFERRED_OUT)).map(concept -> concept.getConceptId()).orElse(null)); + testAttributeConceptMap.put(TestAttribute.LAB_REPORT, Optional.ofNullable(conceptService.getConceptByName(LAB_REPORT)).map(concept -> concept.getConceptId()).orElse(null)); + testAttributeConceptMap.put(TestAttribute.LAB_NOTES, Optional.ofNullable(conceptService.getConceptByName(LAB_NOTES)).map(concept -> concept.getConceptId()).orElse(null)); + testAttributeConceptMap.put(TestAttribute.LAB_RESULT, Optional.ofNullable(conceptService.getConceptByName(LAB_RESULT)).map(concept -> concept.getConceptId()).orElse(null)); + + //now get the observations for the orders + List labOrderResultList = orders.stream().map(order -> { + List obsForOrder = obsForOrders.stream().filter(obs -> obs.getOrder().getOrderId().equals(order.getOrderId())).collect(Collectors.toList()); + Concept orderConcept = order.getConcept(); + List accessionNotes = Collections.emptyList(); + /** + * TODO + * visit(?) Start time + * accession notes + */ + if (obsForOrder.isEmpty()) { + if (orderConcept.getSet()) { + return orderConcept.getSetMembers().stream().map(panelMember -> unFulfilledTestOrderResult(order, panelMember, accessionNotes)).collect(Collectors.toList()); + } + return Collections.singletonList(unFulfilledTestOrderResult(order, orderConcept, accessionNotes)); + } + Obs obsForTest = obsForOrder.get(0); + Date visitStartTime = obsForTest.getEncounter().getVisit().getStartDatetime(); + if (orderConcept.getSet()) { + //order is a panel + List panelLabResults = orderConcept.getSetMembers().stream().map(memberConcept -> { + Optional memberResult = obsForTest.getGroupMembers().stream().filter(memberObs -> memberObs.getConcept().equals(memberConcept)).findFirst(); + if (!memberResult.isPresent()) { + return unFulfilledTestOrderResult(order, memberConcept, accessionNotes); + } + List leafPanelMemberObs = new ArrayList<>(); + flattenObsGroup(memberResult.get(), leafPanelMemberObs); + return getLabOrderResult(order, leafPanelMemberObs, testAttributeConceptMap, memberConcept, accessionNotes, visitStartTime); + }).collect(Collectors.toList()); + return panelLabResults; + } + //this is for individual test, not panel members + List testResultList = new ArrayList<>(); + flattenObsGroup(obsForTest, testResultList); + LabOrderResult labResult = getLabOrderResult(order, testResultList, testAttributeConceptMap, orderConcept, accessionNotes, visitStartTime); + return Collections.singletonList(labResult); + }).flatMap(Collection::stream).collect(Collectors.toList()); + return labOrderResultList; + } + + private Optional getResultForAttribute(List results, Optional attributeConceptId) { + return attributeConceptId.map(conceptId -> results.stream().filter(obs -> obs.getConcept().getConceptId().equals(conceptId)).findFirst()).orElse(Optional.empty()); + } + + private LabOrderResult getLabOrderResult( + Order order, List leafPanelMemberObs, + Map testAttributeConceptMap, + Concept test, + List accessionNotes, + Date visitStartTime) { + + Optional abnormalObs = getResultForAttribute(leafPanelMemberObs, Optional.ofNullable(testAttributeConceptMap.get(TestAttribute.ABNORMAL))); + Optional minNormalObs = getResultForAttribute(leafPanelMemberObs, Optional.ofNullable(testAttributeConceptMap.get(TestAttribute.MIN_NORMAL))); + Optional maxNormalObs = getResultForAttribute(leafPanelMemberObs, Optional.ofNullable(testAttributeConceptMap.get(TestAttribute.MAX_NORMAL))); + Optional resultObs = getResultForAttribute(leafPanelMemberObs, Optional.ofNullable(testAttributeConceptMap.get(TestAttribute.LAB_RESULT))); + Optional referredOutObs = getResultForAttribute(leafPanelMemberObs, Optional.ofNullable(testAttributeConceptMap.get(TestAttribute.REFERRED_OUT))); + Optional labReportObs = getResultForAttribute(leafPanelMemberObs, Optional.ofNullable(testAttributeConceptMap.get(TestAttribute.LAB_REPORT))); + Optional labNotesObs = getResultForAttribute(leafPanelMemberObs, Optional.ofNullable(testAttributeConceptMap.get(TestAttribute.LAB_NOTES))); + //TODO: result is null in case of just report upload + Set providers = resultObs.map(obs -> obs.getEncounter().getEncounterProviders()) + .orElseGet(() -> labReportObs.isPresent() ? labReportObs.get().getEncounter().getEncounterProviders() : Collections.emptySet()); + + Concept orderConcept = order.getConcept(); + return new LabOrderResult.Builder() + .order(order.getUuid()) + .action(order.getAction().name()) + .accession(Optional.ofNullable(order.getEncounter()).map(encounter -> encounter.getUuid()).orElse(null)) + .accessionDateTime(Optional.ofNullable(order.getEncounter()).map(encounter -> encounter.getEncounterDatetime()).orElse(null)) + .testName(test.getName().getName()) + .testUuid(test.getUuid()) + .preferredTestName(test.getShortNames().stream().findFirst().map(conceptName -> conceptName.getName()).orElse(test.getName().getName())) + .uom(getUom(test)) + .result(resultObs.map(obs -> { + Object res = getValue(obs); + return res != null ? res.toString() : null; + }).orElse(null)) + .resultDateTime(resultObs.map(obs -> obs.getObsDatetime()).orElseGet(() -> labReportObs.map(obs -> obs.getObsDatetime()).orElse(null))) + .minNormal(minNormalObs.map(obs -> (Double) getValue(obs)).orElse(null)) + .maxNormal(maxNormalObs.map(obs -> (Double) getValue(obs)).orElse(null)) + .abnormal(abnormalObs.map(obs -> (Boolean) getValue(obs)).orElse(false)) + .referredOut(referredOutObs.map(obs -> (Boolean) getValue(obs)).orElse(false)) + .uploadedFileName(labReportObs.map(obs -> (String) getValue(obs)).orElse(null)) + .notes(labNotesObs.map(obs -> (String) getValue(obs)).orElse(null)) + .accessionNotes(accessionNotes) + .provider(providers != null && !providers.isEmpty() ? providers.stream().findFirst().get().getProvider().getName() : null) + .visitStartTime(visitStartTime) + .panelName(orderConcept.getSet() ? orderConcept.getName().getName() : null) + .preferredPanelName(orderConcept.getSet() ? + orderConcept.getShortNames().stream().findFirst().map(conceptName -> conceptName.getName()).orElse(orderConcept.getName().getName()) + : null) + .panelUuid(orderConcept.getSet() ? orderConcept.getUuid() : null) + .build(); + } + + + private LabOrderResult unFulfilledTestOrderResult(Order order, Concept test, List accessionNotes) { + Concept orderConcept = order.getConcept(); + return new LabOrderResult.Builder() + .order(order.getUuid()) + .action(order.getAction().name()) + .accession(Optional.ofNullable(order.getEncounter()).map(encounter -> encounter.getUuid()).orElse(null)) + .accessionDateTime(Optional.ofNullable(order.getEncounter()).map(encounter -> encounter.getEncounterDatetime()).orElse(null)) + .panelName(orderConcept.getSet() ? orderConcept.getName().getName() : null) + .preferredPanelName(orderConcept.getSet() ? + orderConcept.getShortNames().stream().findFirst().map(conceptName -> conceptName.getName()).orElse(orderConcept.getName().getName()) + : null) + .panelUuid(orderConcept.getSet() ? orderConcept.getUuid() : null) + .testName(test.getName().getName()) + .uom(getUom(test)) + .testUuid(orderConcept.getUuid()) + .preferredTestName(test.getShortNames().stream().findFirst().map(conceptName -> conceptName.getName()).orElse(test.getName().getName())) + .referredOut(false) + .accessionNotes(accessionNotes) + .visitStartTime(order.getEncounter().getVisit().getStartDatetime()) + .build(); + } + + private String getUom(Concept concept) { + if (!concept.isNumeric()) { + return null; + } + if (concept instanceof ConceptNumeric) { + return ((ConceptNumeric) concept).getUnits(); + } else { + return Optional.ofNullable(conceptService.getConceptNumeric(concept.getConceptId())).map(conceptNumeric -> conceptNumeric.getUnits()).orElse(null); + } + } + + private Object getValue(Obs obs) { + Concept concept = obs.getConcept(); + if (concept.getDatatype().isNumeric()) return obs.getValueNumeric(); + if (concept.getDatatype().isCoded()) { + return obs.getValueCoded().getDisplayString(); + } + if (concept.getDatatype().isBoolean()) return obs.getValueBoolean(); + if (concept.getDatatype().isDate()) return obs.getValueDate() != null ? new SimpleDateFormat("yyyy-MM-dd").format(obs.getValueDate()) : null;; + if (concept.getDatatype().isDateTime()) return obs.getValueDatetime() != null ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(obs.getValueDatetime()) : null; + return obs.getValueAsString(Context.getLocale()); + } + + private void flattenObsGroup(Obs obs, List obsList) { + if (!obs.isObsGrouping()) { + obsList.add(obs); + } else { + obs.getGroupMembers().forEach(member -> flattenObsGroup(member, obsList)); + } + } + + private List filterLabOrderResults(List labOrderResults) { List filteredResults = new ArrayList<>(); for (LabOrderResult labOrderResult : labOrderResults) { diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/ObsDao.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/ObsDao.java index b1683cc4e8..4c1cc51236 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/ObsDao.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/ObsDao.java @@ -36,4 +36,6 @@ public interface ObsDao { Obs getChildObsFromParent(String parentObsUuid, Concept childConcept); List getObsByPatientProgramUuidAndConceptNames(String patientProgramUuid, List conceptNames, Integer limit, ObsDaoImpl.OrderBy sortOrder, Date startDate, Date endDate); + + List getObsForOrders(List orders); } diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/OrderDao.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/OrderDao.java index 142b64849c..96c7291236 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/OrderDao.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/OrderDao.java @@ -4,6 +4,7 @@ import org.openmrs.Concept; import org.openmrs.DrugOrder; import org.openmrs.Encounter; +import org.openmrs.Obs; import org.openmrs.Order; import org.openmrs.OrderType; import org.openmrs.Patient; @@ -57,4 +58,7 @@ List getInactiveOrders(Patient patient, OrderType orderTypeByName, CareSe List getOrdersByPatientProgram(String patientProgramUuid, OrderType orderTypeByUuid, Set conceptsForDrugs); List getAllOrders(Patient patientByUuid, OrderType drugOrderTypeUuid, Integer offset, Integer limit, List locationUuids); + + List getLabOrdersForPatient(Patient patient, Integer numberOfVisits, boolean includeActiveVisits); + } diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/ObsDaoImpl.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/ObsDaoImpl.java index 474d564a60..25542bd6af 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/ObsDaoImpl.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/ObsDaoImpl.java @@ -382,4 +382,14 @@ public List getObsByPatientProgramUuidAndConceptNames(String patientProgram return queryToGetObs.list(); } + + @Override + public List getObsForOrders(List orders) { + org.hibernate.query.Query query = sessionFactory.getCurrentSession().createQuery( + "select obs from Obs obs where obs.voided = false and obs.order in (:orders) and obs.obsGroup is null order by obs.obsDatetime desc"); + query.setParameter("orders", orders); + return query.list(); + } + + } diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/OrderDaoImpl.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/OrderDaoImpl.java index 0cf6b04ac9..c502e83e80 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/OrderDaoImpl.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/dao/impl/OrderDaoImpl.java @@ -8,13 +8,13 @@ import org.bahmni.module.bahmnicore.dao.OrderDao; import org.codehaus.jackson.map.ObjectMapper; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; +import org.hibernate.query.Query; import org.openmrs.CareSetting; import org.openmrs.Concept; import org.openmrs.DrugOrder; @@ -368,6 +368,31 @@ public List getAllOrders(Patient patientByUuid, OrderType drugOrderTypeUu return getAllOrders(patientByUuid, Arrays.asList(drugOrderTypeUuid), offset, limit); } + @Override + public List getLabOrdersForPatient(Patient patient, Integer numberOfVisits, boolean includeActiveVisits) { + Query visitsToCheck = sessionFactory.getCurrentSession().createQuery( + "select v.visitId from Visit v " + + " where v.patient.patientId = :patientId and v.voided = false" + + " order by v.startDatetime desc"); + visitsToCheck.setParameter("patientId", patient.getId()); + visitsToCheck.setMaxResults(numberOfVisits); + List visitList = visitsToCheck.list(); + + Query orderQuery = sessionFactory.getCurrentSession().createQuery( + "select testOrder from Order testOrder, Encounter enc, Visit v " + + "where testOrder.encounter = enc and enc.visit = v " + + " and testOrder.voided = false and testOrder.action != :discontinued " + + " and testOrder.orderType.name = :orderType" + + " and v.visitId in (:visitList) " + + " order by testOrder.dateCreated desc"); + + orderQuery.setParameter("discontinued", Order.Action.DISCONTINUE); + orderQuery.setParameter("orderType", "Lab Order"); + orderQuery.setParameter("visitList", visitList); + return orderQuery.list(); + } + + @Override public Map getDiscontinuedDrugOrders(List drugOrders) { diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/OrderService.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/OrderService.java index 6800c02204..8165951bf6 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/OrderService.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/OrderService.java @@ -1,9 +1,11 @@ package org.bahmni.module.bahmnicore.service; +import org.openmrs.Obs; import org.openmrs.Order; import org.openmrs.Patient; import org.openmrs.Visit; +import javax.validation.constraints.NotNull; import java.util.List; public interface OrderService { @@ -20,4 +22,9 @@ public interface OrderService { List getAllOrdersForVisitUuid(String visitUuid, String orderTypeUuid); Order getChildOrder(Order order); + + List getLabOrdersForPatient(@NotNull String patientUuid, @NotNull Integer numberOfVisits); + + + List getObsForOrders(List orders); } diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/impl/OrderServiceImpl.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/impl/OrderServiceImpl.java index cf05a70cd3..fb64a7837b 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/impl/OrderServiceImpl.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/service/impl/OrderServiceImpl.java @@ -1,8 +1,10 @@ package org.bahmni.module.bahmnicore.service.impl; +import org.bahmni.module.bahmnicore.dao.ObsDao; import org.bahmni.module.bahmnicore.dao.OrderDao; import org.bahmni.module.bahmnicore.dao.VisitDao; import org.bahmni.module.bahmnicore.service.OrderService; +import org.openmrs.Obs; import org.openmrs.Order; import org.openmrs.OrderType; import org.openmrs.Patient; @@ -22,12 +24,15 @@ public class OrderServiceImpl implements OrderService { private VisitDao visitDao; private OrderDao orderDao; + private ObsDao obsDao; + @Autowired - public OrderServiceImpl(org.openmrs.api.OrderService orderService, PatientService patientService, VisitDao visitDao, OrderDao orderDao) { + public OrderServiceImpl(org.openmrs.api.OrderService orderService, PatientService patientService, VisitDao visitDao, OrderDao orderDao, ObsDao obsDao) { this.orderService = orderService; this.patientService = patientService; this.visitDao = visitDao; this.orderDao = orderDao; + this.obsDao = obsDao; } @Override @@ -72,4 +77,17 @@ public List getAllOrdersForVisitUuid(String visitUuid, String orderTypeUu public Order getChildOrder(Order order) { return orderDao.getChildOrder(order); } + + @Override + public List getLabOrdersForPatient(String patientUuid, Integer numberOfVisits) { + List orders = orderDao.getLabOrdersForPatient(patientService.getPatientByUuid(patientUuid), numberOfVisits, true); + return orders; + } + + @Override + public List getObsForOrders(List orders) { + return obsDao.getObsForOrders(orders); + } + + } \ No newline at end of file diff --git a/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/display/controls/BahmniLabOrderResultController.java b/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/display/controls/BahmniLabOrderResultController.java index c74710c7c1..ffa134fea6 100644 --- a/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/display/controls/BahmniLabOrderResultController.java +++ b/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/display/controls/BahmniLabOrderResultController.java @@ -1,9 +1,14 @@ package org.bahmni.module.bahmnicore.web.v1_0.controller.display.controls; import org.bahmni.module.bahmnicore.dao.OrderDao; +import org.bahmni.module.bahmnicore.service.OrderService; +import org.openmrs.Obs; +import org.openmrs.Order; import org.openmrs.Patient; import org.openmrs.Visit; import org.openmrs.api.PatientService; +import org.openmrs.api.context.Context; +import org.openmrs.module.bahmniemrapi.laborder.contract.LabOrderResult; import org.openmrs.module.bahmniemrapi.laborder.contract.LabOrderResults; import org.openmrs.module.bahmniemrapi.laborder.service.LabOrderResultsService; import org.openmrs.module.webservices.rest.web.RestConstants; @@ -15,7 +20,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import java.util.Collections; import java.util.List; +import java.util.Optional; @Controller @RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/bahmnicore/labOrderResults") @@ -58,6 +65,24 @@ public LabOrderResults getForPatient( return labOrderResultsService.getAll(patient, visits, numberOfAccessions); } + @RequestMapping(method = RequestMethod.GET, params = {"patient"}) + @ResponseBody + public LabOrderResults getResultsForPatient( + @RequestParam(value = "patient", required = true) String patient, + @RequestParam(value = "numberOfVisits", required = false) Integer numberOfVisits, + @RequestParam(value = "numberOfAccessions", required = false) Integer numberOfAccessions) { + return findOrderService().map(orderService -> { + List orders = orderService.getLabOrdersForPatient(patient, numberOfVisits); + List obsList = orderService.getObsForOrders(orders); + List results = labOrderResultsService.resultsForOrders(orders, obsList, Optional.ofNullable(numberOfAccessions).orElse(Integer.MAX_VALUE)); + return new LabOrderResults(results); + }).orElse(new LabOrderResults(Collections.emptyList())); + } + + private Optional findOrderService() { + return Context.getRegisteredComponents(OrderService.class).stream().findAny(); + } + private Patient patientFrom(List visits) { return visits.get(0).getPatient(); }