Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 57da589

Browse files
Merge pull request SORMAS-Foundation#4021 from hzi-braunschweig/SORMAS-Foundation#3843-Bulk_editing_cases_takes_a_very_long_time
SORMAS-Foundation#3843 bulk editing cases takes a very long time
2 parents d1ab87a + 85ae009 commit 57da589

5 files changed

Lines changed: 182 additions & 44 deletions

File tree

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseBulkEditData.java renamed to sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseBulkEditData.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
1-
package de.symeda.sormas.ui.caze;
1+
/*
2+
* ******************************************************************************
3+
* * SORMAS® - Surveillance Outbreak Response Management & Analysis System
4+
* * Copyright © 2016-2021 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
5+
* *
6+
* * This program is free software: you can redistribute it and/or modify
7+
* * it under the terms of the GNU General Public License as published by
8+
* * the Free Software Foundation, either version 3 of the License, or
9+
* * (at your option) any later version.
10+
* *
11+
* * This program is distributed in the hope that it will be useful,
12+
* * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* * GNU General Public License for more details.
15+
* *
16+
* * You should have received a copy of the GNU General Public License
17+
* * along with this program. If not, see <https://www.gnu.org/licenses/>.
18+
* ******************************************************************************
19+
*/
20+
21+
package de.symeda.sormas.api.caze;
222

323
import de.symeda.sormas.api.Disease;
424
import de.symeda.sormas.api.EntityDto;
5-
import de.symeda.sormas.api.caze.CaseClassification;
6-
import de.symeda.sormas.api.caze.CaseOutcome;
7-
import de.symeda.sormas.api.caze.DengueFeverType;
8-
import de.symeda.sormas.api.caze.InvestigationStatus;
9-
import de.symeda.sormas.api.caze.PlagueType;
10-
import de.symeda.sormas.api.caze.RabiesType;
1125
import de.symeda.sormas.api.facility.FacilityReferenceDto;
1226
import de.symeda.sormas.api.facility.FacilityType;
1327
import de.symeda.sormas.api.region.CommunityReferenceDto;

sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,23 @@ List<DashboardQuarantineDataDto> getQuarantineDataForDashBoard(
185185
List<ManualMessageLogDto> getMessageLog(String caseUuid, MessageType messageType);
186186

187187
String getFirstCaseUuidWithOwnershipHandedOver(List<String> caseUuids);
188+
189+
void saveBulkCase(
190+
List<String> caseUuidList,
191+
CaseBulkEditData updatedCaseBulkEditData,
192+
boolean diseaseChange,
193+
boolean classificationChange,
194+
boolean investigationStatusChange,
195+
boolean outcomeChange,
196+
boolean surveillanceOfficerChange);
197+
198+
void saveBulkEditWithFacilities(
199+
List<String> caseUuidList,
200+
CaseBulkEditData updatedCaseBulkEditData,
201+
boolean diseaseChange,
202+
boolean classificationChange,
203+
boolean investigationStatusChange,
204+
boolean outcomeChange,
205+
boolean surveillanceOfficerChange,
206+
Boolean doTransfer);
188207
}

sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.HashMap;
3535
import java.util.List;
3636
import java.util.Map;
37+
import java.util.Objects;
3738
import java.util.Optional;
3839
import java.util.Random;
3940
import java.util.Set;
@@ -77,6 +78,7 @@
7778
import de.symeda.sormas.api.caze.AgeAndBirthDateDto;
7879
import de.symeda.sormas.api.caze.BirthDateDto;
7980
import de.symeda.sormas.api.caze.BurialInfoDto;
81+
import de.symeda.sormas.api.caze.CaseBulkEditData;
8082
import de.symeda.sormas.api.caze.CaseClassification;
8183
import de.symeda.sormas.api.caze.CaseCriteria;
8284
import de.symeda.sormas.api.caze.CaseDataDto;
@@ -131,6 +133,7 @@
131133
import de.symeda.sormas.api.person.PersonDto;
132134
import de.symeda.sormas.api.person.PersonReferenceDto;
133135
import de.symeda.sormas.api.person.PresentCondition;
136+
import de.symeda.sormas.api.region.CommunityReferenceDto;
134137
import de.symeda.sormas.api.region.DistrictDto;
135138
import de.symeda.sormas.api.region.DistrictReferenceDto;
136139
import de.symeda.sormas.api.region.RegionReferenceDto;
@@ -1477,11 +1480,119 @@ public CaseDataDto saveCase(CaseDataDto dto) throws ValidationRuntimeException {
14771480
return saveCase(dto, true);
14781481
}
14791482

1483+
public void saveBulkCase(
1484+
List<String> caseUuidList,
1485+
CaseBulkEditData updatedCaseBulkEditData,
1486+
boolean diseaseChange,
1487+
boolean classificationChange,
1488+
boolean investigationStatusChange,
1489+
boolean outcomeChange,
1490+
boolean surveillanceOfficerChange)
1491+
throws ValidationRuntimeException {
1492+
1493+
for (String caseUuid : caseUuidList) {
1494+
Case caze = caseService.getByUuid(caseUuid);
1495+
CaseDataDto existingCaseDto = toDto(caze);
1496+
1497+
updateCaseWithBulkData(
1498+
updatedCaseBulkEditData,
1499+
caze,
1500+
diseaseChange,
1501+
classificationChange,
1502+
investigationStatusChange,
1503+
outcomeChange,
1504+
surveillanceOfficerChange);
1505+
doSave(caze, true, existingCaseDto);
1506+
}
1507+
}
1508+
1509+
public void saveBulkEditWithFacilities(
1510+
List<String> caseUuidList,
1511+
CaseBulkEditData updatedCaseBulkEditData,
1512+
boolean diseaseChange,
1513+
boolean classificationChange,
1514+
boolean investigationStatusChange,
1515+
boolean outcomeChange,
1516+
boolean surveillanceOfficerChange,
1517+
Boolean doTransfer) {
1518+
1519+
Region newRegion = regionService.getByUuid(updatedCaseBulkEditData.getRegion().getUuid());
1520+
District newDistrict = districtService.getByUuid(updatedCaseBulkEditData.getDistrict().getUuid());
1521+
CommunityReferenceDto communityDto = updatedCaseBulkEditData.getCommunity();
1522+
Community newCommunity = null;
1523+
if (communityDto != null) {
1524+
newCommunity = communityService.getByUuid(updatedCaseBulkEditData.getCommunity().getUuid());
1525+
}
1526+
1527+
for (String caseUuid : caseUuidList) {
1528+
Case caze = caseService.getByUuid(caseUuid);
1529+
CaseDataDto existingCaseDto = toDto(caze);
1530+
1531+
updateCaseWithBulkData(
1532+
updatedCaseBulkEditData,
1533+
caze,
1534+
diseaseChange,
1535+
classificationChange,
1536+
investigationStatusChange,
1537+
outcomeChange,
1538+
surveillanceOfficerChange);
1539+
1540+
caze.setRegion(newRegion);
1541+
caze.setDistrict(newDistrict);
1542+
caze.setCommunity(newCommunity);
1543+
caze.setFacilityType(updatedCaseBulkEditData.getFacilityType());
1544+
caze.setHealthFacility(facilityService.getByUuid(updatedCaseBulkEditData.getHealthFacility().getUuid()));
1545+
caze.setHealthFacilityDetails(updatedCaseBulkEditData.getHealthFacilityDetails());
1546+
CaseLogic.handleHospitalization(toDto(caze), existingCaseDto, doTransfer);
1547+
doSave(caze, true, existingCaseDto);
1548+
}
1549+
}
1550+
1551+
private void updateCaseWithBulkData(
1552+
CaseBulkEditData updatedCaseBulkEditData,
1553+
Case existingCase,
1554+
boolean diseaseChange,
1555+
boolean classificationChange,
1556+
boolean investigationStatusChange,
1557+
boolean outcomeChange,
1558+
boolean surveillanceOfficerChange) {
1559+
1560+
if (diseaseChange) {
1561+
existingCase.setDisease(updatedCaseBulkEditData.getDisease());
1562+
existingCase.setDiseaseDetails(updatedCaseBulkEditData.getDiseaseDetails());
1563+
existingCase.setPlagueType(updatedCaseBulkEditData.getPlagueType());
1564+
existingCase.setDengueFeverType(updatedCaseBulkEditData.getDengueFeverType());
1565+
existingCase.setRabiesType(updatedCaseBulkEditData.getRabiesType());
1566+
}
1567+
if (classificationChange) {
1568+
existingCase.setCaseClassification(updatedCaseBulkEditData.getCaseClassification());
1569+
}
1570+
if (investigationStatusChange) {
1571+
existingCase.setInvestigationStatus(updatedCaseBulkEditData.getInvestigationStatus());
1572+
}
1573+
if (outcomeChange) {
1574+
existingCase.setOutcome(updatedCaseBulkEditData.getOutcome());
1575+
}
1576+
// Setting the surveillance officer is only allowed if all selected cases are in
1577+
// the same district
1578+
if (surveillanceOfficerChange) {
1579+
existingCase.setSurveillanceOfficer(userService.getByUuid(updatedCaseBulkEditData.getSurveillanceOfficer().getUuid()));
1580+
}
1581+
1582+
if (Objects.nonNull(updatedCaseBulkEditData.getHealthFacilityDetails())) {
1583+
existingCase.setHealthFacilityDetails(updatedCaseBulkEditData.getHealthFacilityDetails());
1584+
}
1585+
}
1586+
14801587
public CaseDataDto saveCase(CaseDataDto dto, boolean handleChanges) throws ValidationRuntimeException {
14811588

14821589
Case caze = caseService.getByUuid(dto.getUuid());
14831590
CaseDataDto existingCaseDto = handleChanges ? toDto(caze) : null;
14841591

1592+
return caseSave(dto, handleChanges, caze, existingCaseDto);
1593+
}
1594+
1595+
private CaseDataDto caseSave(CaseDataDto dto, boolean handleChanges, Case caze, CaseDataDto existingCaseDto) {
14851596
SymptomsHelper.updateIsSymptomatic(dto.getSymptoms());
14861597

14871598
restorePseudonymizedDto(dto, caze, existingCaseDto);
@@ -1495,15 +1606,19 @@ public CaseDataDto saveCase(CaseDataDto dto, boolean handleChanges) throws Valid
14951606
caze.setCreationVersion(InfoProvider.get().getVersion());
14961607
}
14971608

1609+
doSave(caze, handleChanges, existingCaseDto);
1610+
1611+
return convertToDto(caze, Pseudonymizer.getDefault(userService::hasRight));
1612+
}
1613+
1614+
private void doSave(Case caze, boolean handleChanges, CaseDataDto existingCaseDto) {
14981615
caseService.ensurePersisted(caze);
14991616
if (handleChanges) {
15001617
updateCaseVisitAssociations(existingCaseDto, caze);
15011618
caseService.updateFollowUpUntilAndStatus(caze);
15021619

15031620
onCaseChanged(existingCaseDto, caze);
15041621
}
1505-
1506-
return convertToDto(caze, Pseudonymizer.getDefault(userService::hasRight));
15071622
}
15081623

15091624
private void updateCaseVisitAssociations(CaseDataDto existingCase, Case caze) {

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/BulkCaseDataForm.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
import de.symeda.sormas.api.Disease;
4141
import de.symeda.sormas.api.FacadeProvider;
42+
import de.symeda.sormas.api.caze.CaseBulkEditData;
4243
import de.symeda.sormas.api.caze.CaseDataDto;
4344
import de.symeda.sormas.api.caze.CaseIndexDto;
4445
import de.symeda.sormas.api.event.TypeOfPlace;

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import de.symeda.sormas.api.Disease;
5050
import de.symeda.sormas.api.DiseaseHelper;
5151
import de.symeda.sormas.api.FacadeProvider;
52+
import de.symeda.sormas.api.caze.CaseBulkEditData;
5253
import de.symeda.sormas.api.caze.CaseCriteria;
5354
import de.symeda.sormas.api.caze.CaseDataDto;
5455
import de.symeda.sormas.api.caze.CaseFacade;
@@ -681,6 +682,7 @@ public void showBulkCaseDataEditComponent(Collection<? extends CaseIndexDto> sel
681682
boolean surveillanceOfficerChange = district != null && form.getSurveillanceOfficerCheckBox().getValue();
682683
boolean facilityChange = form.getHealthFacilityCheckbox().getValue();
683684

685+
CaseFacade caseFacade = FacadeProvider.getCaseFacade();
684686
if (facilityChange) {
685687
VaadinUiUtil.showChooseOptionPopup(
686688
I18nProperties.getCaption(Captions.caseInfrastructureDataChanged),
@@ -697,15 +699,15 @@ public void showBulkCaseDataEditComponent(Collection<? extends CaseIndexDto> sel
697699
investigationStatusChange,
698700
outcomeChange,
699701
surveillanceOfficerChange,
700-
e.booleanValue());
702+
e.booleanValue(),
703+
caseFacade);
701704

702705
popupWindow.close();
703706
navigateToIndex();
704707
Notification.show(I18nProperties.getString(Strings.messageCasesEdited), Type.HUMANIZED_MESSAGE);
705708
});
706709

707710
} else {
708-
CaseFacade caseFacade = FacadeProvider.getCaseFacade();
709711
bulkEdit(
710712
selectedCases,
711713
updatedBulkEditData,
@@ -735,18 +737,14 @@ private void bulkEdit(
735737
boolean surveillanceOfficerChange,
736738
CaseFacade caseFacade) {
737739

738-
for (CaseIndexDto indexDto : selectedCases) {
739-
CaseDataDto caseDto = changeCaseDto(
740-
updatedCaseBulkEditData,
741-
caseFacade.getCaseDataByUuid(indexDto.getUuid()),
742-
diseaseChange,
743-
classificationChange,
744-
investigationStatusChange,
745-
outcomeChange,
746-
surveillanceOfficerChange);
747-
748-
caseFacade.saveCase(caseDto);
749-
}
740+
caseFacade.saveBulkCase(
741+
selectedCases.stream().map(CaseIndexDto::getUuid).collect(Collectors.toList()),
742+
updatedCaseBulkEditData,
743+
diseaseChange,
744+
classificationChange,
745+
investigationStatusChange,
746+
outcomeChange,
747+
surveillanceOfficerChange);
750748
}
751749

752750
private void bulkEditWithFacilities(
@@ -757,27 +755,18 @@ private void bulkEditWithFacilities(
757755
boolean investigationStatusChange,
758756
boolean outcomeChange,
759757
boolean surveillanceOfficerChange,
760-
Boolean doTransfer) {
761-
762-
CaseFacade caseFacade = FacadeProvider.getCaseFacade();
763-
for (CaseIndexDto indexDto : selectedCases) {
764-
CaseDataDto updatedCase = changeCaseDto(
765-
updatedCaseBulkEditData,
766-
caseFacade.getCaseDataByUuid(indexDto.getUuid()),
767-
diseaseChange,
768-
classificationChange,
769-
investigationStatusChange,
770-
outcomeChange,
771-
surveillanceOfficerChange);
772-
updatedCase.setRegion(updatedCaseBulkEditData.getRegion());
773-
updatedCase.setDistrict(updatedCaseBulkEditData.getDistrict());
774-
updatedCase.setCommunity(updatedCaseBulkEditData.getCommunity());
775-
updatedCase.setFacilityType(updatedCaseBulkEditData.getFacilityType());
776-
updatedCase.setHealthFacility(updatedCaseBulkEditData.getHealthFacility());
777-
updatedCase.setHealthFacilityDetails(updatedCaseBulkEditData.getHealthFacilityDetails());
778-
CaseLogic.handleHospitalization(updatedCase, caseFacade.getCaseDataByUuid(indexDto.getUuid()), doTransfer);
779-
caseFacade.saveCase(updatedCase);
780-
}
758+
Boolean doTransfer,
759+
CaseFacade caseFacade) {
760+
761+
caseFacade.saveBulkEditWithFacilities(
762+
selectedCases.stream().map(CaseIndexDto::getUuid).collect(Collectors.toList()),
763+
updatedCaseBulkEditData,
764+
diseaseChange,
765+
classificationChange,
766+
investigationStatusChange,
767+
outcomeChange,
768+
surveillanceOfficerChange,
769+
doTransfer);
781770
}
782771

783772
private CaseDataDto changeCaseDto(

0 commit comments

Comments
 (0)