diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java index 2f487dd..e09998e 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java @@ -1,6 +1,5 @@ package org.openmrs.module.ipd.service.impl; - import org.openmrs.module.ipd.api.model.AdmittedPatient; import org.openmrs.module.ipd.api.model.IPDPatientDetails; import org.openmrs.module.ipd.api.model.WardPatientsSummary; @@ -12,6 +11,8 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.regex.Pattern; @Service @Transactional @@ -24,6 +25,7 @@ public IPDWardServiceImpl(WardService wardService) { this.wardService = wardService; } + private static final Pattern numericPattern = Pattern.compile("^\\d+$"); @Override public WardPatientsSummary getIPDWardPatientSummary(String wardUuid, String providerUuid) { @@ -38,11 +40,12 @@ public IPDPatientDetails getIPDPatientByWard(String wardUuid, Integer offset, In if (admittedPatients ==null ){ return new IPDPatientDetails(new ArrayList<>(),0); } + List admittedPatientsSortedList = Objects.equals(sortBy, "bedNumber") ? sortNumericBedNumbers(admittedPatients) : admittedPatients; - offset = Math.min(offset, admittedPatients.size()); - limit = Math.min(limit, admittedPatients.size() - offset); + offset = Math.min(offset, admittedPatientsSortedList.size()); + limit = Math.min(limit, admittedPatientsSortedList.size() - offset); - return new IPDPatientDetails(admittedPatients.subList(offset, offset + limit), admittedPatients.size()); + return new IPDPatientDetails(admittedPatientsSortedList.subList(offset, offset + limit), admittedPatientsSortedList.size()); } @Override @@ -53,11 +56,12 @@ public IPDPatientDetails getIPDPatientsByWardAndProvider(String wardUuid, String if (admittedPatients ==null ){ return new IPDPatientDetails(new ArrayList<>(),0); } + List admittedPatientsSortedList = Objects.equals(sortBy, "bedNumber") ? sortNumericBedNumbers(admittedPatients) : admittedPatients; - offset = Math.min(offset, admittedPatients.size()); - limit = Math.min(limit, admittedPatients.size() - offset); + offset = Math.min(offset, admittedPatientsSortedList.size()); + limit = Math.min(limit, admittedPatientsSortedList.size() - offset); - return new IPDPatientDetails(admittedPatients.subList(offset, offset + limit), admittedPatients.size()); + return new IPDPatientDetails(admittedPatientsSortedList.subList(offset, offset + limit), admittedPatientsSortedList.size()); } @Override @@ -65,13 +69,33 @@ public IPDPatientDetails searchIPDPatientsInWard(String wardUuid, List s Integer offset, Integer limit, String sortBy) { List admittedPatients = wardService.searchWardPatients(wardUuid,searchKeys,searchValue,sortBy); + if (admittedPatients ==null ){ return new IPDPatientDetails(new ArrayList<>(),0); } - offset = Math.min(offset, admittedPatients.size()); - limit = Math.min(limit, admittedPatients.size() - offset); + List admittedPatientsSortedList = Objects.equals(sortBy, "bedNumber") ? sortNumericBedNumbers(admittedPatients) : admittedPatients; + + offset = Math.min(offset, admittedPatientsSortedList.size()); + limit = Math.min(limit, admittedPatientsSortedList.size() - offset); + + return new IPDPatientDetails(admittedPatientsSortedList.subList(offset, offset + limit), admittedPatientsSortedList.size()); + } - return new IPDPatientDetails(admittedPatients.subList(offset, offset + limit), admittedPatients.size()); + private List sortNumericBedNumbers(List admittedPatients) { + + boolean allNumeric = admittedPatients.stream() + .map(patient -> patient.getBedPatientAssignment().getBed().getBedNumber()) + .allMatch(bedNumber -> numericPattern.matcher(bedNumber).matches()); + + if(allNumeric) { + admittedPatients.sort((patientA, patientB) -> { + String bedNumberA = patientA.getBedPatientAssignment().getBed().getBedNumber(); + String bedNumberB = patientB.getBedPatientAssignment().getBed().getBedNumber(); + + return Integer.compare(Integer.parseInt(bedNumberA), Integer.parseInt(bedNumberB)); + }); + } + return admittedPatients; } }