From 21c02ac06851afb46e751015aaeda734c4095041 Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer
Date: Wed, 12 Jul 2023 09:50:29 +0200
Subject: Issue #29: Servicemethoden um ECOG Status abzurufen hinzugefügt
---
pom.xml | 6 +++
.../DefaultSystemtherapieService.java | 46 ++++++++++++++++--
.../systemtherapie/SystemtherapieService.java | 56 ++++++++++++++++++++++
.../DefaultSystemtherapieServiceTest.java | 40 +++++++++++++++-
4 files changed, 143 insertions(+), 5 deletions(-)
diff --git a/pom.xml b/pom.xml
index 65940ef..c304c61 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,6 +155,12 @@
2.3
test
+
+ log4j
+ log4j
+ 1.2.17
+ test
+
diff --git a/src/main/java/DNPM/services/systemtherapie/DefaultSystemtherapieService.java b/src/main/java/DNPM/services/systemtherapie/DefaultSystemtherapieService.java
index 7c7e2b6..377e3d9 100644
--- a/src/main/java/DNPM/services/systemtherapie/DefaultSystemtherapieService.java
+++ b/src/main/java/DNPM/services/systemtherapie/DefaultSystemtherapieService.java
@@ -2,11 +2,12 @@ package DNPM.services.systemtherapie;
import DNPM.services.SettingsService;
import de.itc.onkostar.api.IOnkostarApi;
+import de.itc.onkostar.api.Patient;
import de.itc.onkostar.api.Procedure;
+import de.itc.onkostar.api.ProcedureEditStateType;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
/**
* Standardimplementierung des Systemtherapieservices
@@ -15,6 +16,8 @@ import java.util.Map;
*/
public class DefaultSystemtherapieService implements SystemtherapieService {
+ private static final String ECOG_FIELD = "ECOGvorTherapie";
+
private final IOnkostarApi onkostarApi;
private final SettingsService settingsService;
@@ -51,6 +54,43 @@ public class DefaultSystemtherapieService implements SystemtherapieService {
return new OsSystemischeTherapieToProzedurwerteMapper();
}
+ /**
+ * Ermittelt den letzten bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten
+ *
+ * @param patient Der zu verwendende Patient
+ * @return Der ECOG-Status als String oder leeres Optional
+ */
+ @Override
+ public Optional latestEcogStatus(Patient patient) {
+ return ecogSatus(patient).stream()
+ .max(Comparator.comparing(EcogStatusWithDate::getDate))
+ .map(EcogStatusWithDate::getStatus);
+ }
+
+ /**
+ * Ermittelt jeden bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten
+ *
+ * @param patient Der zu verwendende Patient
+ * @return Eine Liste mit Datum und ECOG-Status als String
+ */
+ @Override
+ public List ecogSatus(Patient patient) {
+ return patient.getDiseases().stream()
+ .flatMap(disease -> onkostarApi.getProceduresForDiseaseByForm(disease.getId(), getFormName()).stream())
+ .filter(procedure -> procedure.getEditState() == ProcedureEditStateType.COMPLETED)
+ .filter(procedure -> null != procedure.getStartDate())
+ .sorted(Comparator.comparing(Procedure::getStartDate))
+ .map(procedure -> {
+ try {
+ return new EcogStatusWithDate(procedure.getStartDate(), procedure.getValue(ECOG_FIELD).getString());
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
private String getFormName() {
return settingsService
.getSetting("systemtherapieform")
diff --git a/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java b/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java
index 00b7a6d..0102fc6 100644
--- a/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java
+++ b/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java
@@ -1,9 +1,13 @@
package DNPM.services.systemtherapie;
+import de.itc.onkostar.api.Patient;
import de.itc.onkostar.api.Procedure;
+import org.springframework.util.Assert;
+import java.util.Date;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
/**
* Service für Systemtherapieformulare
@@ -25,4 +29,56 @@ public interface SystemtherapieService {
*/
ProzedurToProzedurwerteMapper prozedurToProzedurwerteMapper(Procedure procedure);
+ /**
+ * Ermittelt den letzten bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten
+ * @param patient Der zu verwendende Patient
+ * @return Der ECOG-Status als String oder leeres Optional
+ */
+ Optional latestEcogStatus(Patient patient);
+
+ /**
+ * Ermittelt jeden bekannten ECOG-Status aus allen Systemtherapieformularen des Patienten
+ * @param patient Der zu verwendende Patient
+ * @return Eine Liste mit Datum und ECOG-Status als String
+ */
+ List ecogSatus(Patient patient);
+
+ /**
+ * Datenklasse zum Abbilden des ECOG-Status und Datum
+ */
+ class EcogStatusWithDate {
+ private Date date;
+ private String status;
+
+ public EcogStatusWithDate(Date date, String status) {
+ Assert.notNull(date, "Date cannot be null");
+ Assert.hasText(status, "Status cannot be empty String");
+ Assert.isTrue(isValidEcogCode(status), "Not a valid ADT.LeistungszustandECOG code");
+ this.date = date;
+ this.status = status;
+ }
+
+ private boolean isValidEcogCode(String status) {
+ switch (status) {
+ case "1":
+ case "2":
+ case "3":
+ case "4":
+ case "5":
+ case "U":
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+ }
+
}
diff --git a/src/test/java/DNPM/services/systemtherapie/DefaultSystemtherapieServiceTest.java b/src/test/java/DNPM/services/systemtherapie/DefaultSystemtherapieServiceTest.java
index 40ce315..7852187 100644
--- a/src/test/java/DNPM/services/systemtherapie/DefaultSystemtherapieServiceTest.java
+++ b/src/test/java/DNPM/services/systemtherapie/DefaultSystemtherapieServiceTest.java
@@ -1,8 +1,7 @@
package DNPM.services.systemtherapie;
import DNPM.services.SettingsService;
-import de.itc.onkostar.api.IOnkostarApi;
-import de.itc.onkostar.api.Procedure;
+import de.itc.onkostar.api.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -12,6 +11,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import java.time.Instant;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
@@ -94,4 +94,40 @@ class DefaultSystemtherapieServiceTest {
.isExactlyInstanceOf(ArrayList.class)
.hasSize(1);
}
+
+ @Test
+ void testShouldReturnListOfEcogStatusWithDate() {
+ doAnswer(invocationOnMock -> {
+ var disease = new Disease(onkostarApi);
+ disease.setId(1);
+ return List.of(disease);
+ }).when(this.onkostarApi).getDiseasesByPatientId(anyInt());
+
+ doAnswer(invocationOnMock -> {
+ var procedure1 = new Procedure(onkostarApi);
+ procedure1.setId(1);
+ procedure1.setFormName("OS.Systemische Therapie");
+ procedure1.setStartDate(Date.from(Instant.parse("2023-07-01T06:00:00Z")));
+ procedure1.setEditState(ProcedureEditStateType.COMPLETED);
+ procedure1.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 1));
+
+ var procedure2 = new Procedure(onkostarApi);
+ procedure2.setId(2);
+ procedure2.setFormName("OS.Systemische Therapie");
+ procedure2.setStartDate(Date.from(Instant.parse("2023-07-12T06:00:00Z")));
+ procedure2.setEditState(ProcedureEditStateType.COMPLETED);
+ procedure2.setValue("ECOGvorTherapie", new Item("ECOGvorTherapie", 2));
+ return List.of(procedure1, procedure2);
+ }).when(this.onkostarApi).getProceduresForDiseaseByForm(anyInt(), anyString());
+
+ var patient = new Patient(onkostarApi);
+ patient.setId(1);
+
+ var actual = service.ecogSatus(patient);
+
+ assertThat(actual)
+ .isNotNull()
+ .isExactlyInstanceOf(ArrayList.class)
+ .hasSize(2);
+ }
}
--
cgit v1.2.3
From a6238c14e3c08b4f7ee7045824eae4e47890ccd3 Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer
Date: Wed, 12 Jul 2023 10:11:11 +0200
Subject: Issue #29: Backend-Service für ECOG-Status hinzugefügt
---
src/main/java/DNPM/DNPMHelper.java | 19 ++++++++++++++++++-
src/test/java/DNPM/DNPMHelperTest.java | 18 ++++++++++++++++++
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/src/main/java/DNPM/DNPMHelper.java b/src/main/java/DNPM/DNPMHelper.java
index cc8126a..50b153e 100644
--- a/src/main/java/DNPM/DNPMHelper.java
+++ b/src/main/java/DNPM/DNPMHelper.java
@@ -45,7 +45,7 @@ public class DNPMHelper implements IProcedureAnalyzer {
@Override
public String getVersion() {
- return "0.3.0";
+ return "0.4.0";
}
@Override
@@ -249,4 +249,21 @@ public class DNPMHelper implements IProcedureAnalyzer {
}
}
+
+ // TODO Achtung, keine Sicherheitsprüfung, darüber kann für jeden Patienten die Liste mit ECOG-Status abgerufen werden!
+ public List getEcogStatus(final Map input) {
+ var pid = AnalyzerUtils.getRequiredId(input, "PatientId");
+ if (pid.isEmpty()) {
+ logger.error("Kein Parameter 'PatientId' angegeben, gebe leere Liste zurück");
+ return List.of();
+ }
+
+ var patient = onkostarApi.getPatient(pid.get());
+ if (null == patient) {
+ logger.error("Patient nicht gefunden, gebe leere Liste zurück");
+ return List.of();
+ }
+
+ return systemtherapieService.ecogSatus(patient);
+ }
}
\ No newline at end of file
diff --git a/src/test/java/DNPM/DNPMHelperTest.java b/src/test/java/DNPM/DNPMHelperTest.java
index a90f2fb..cd0b81d 100644
--- a/src/test/java/DNPM/DNPMHelperTest.java
+++ b/src/test/java/DNPM/DNPMHelperTest.java
@@ -3,6 +3,7 @@ package DNPM;
import DNPM.services.systemtherapie.SystemtherapieService;
import de.itc.onkostar.api.IOnkostarApi;
import de.itc.onkostar.api.Item;
+import de.itc.onkostar.api.Patient;
import de.itc.onkostar.api.Procedure;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
@@ -245,6 +246,23 @@ class DNPMHelperTest {
assertThat(argumentCaptor.getValue()).contains("WHERE patient_id = 2 AND geloescht = 0");
}
+ @Test
+ void testShouldReturnEcogStatusList() {
+ doAnswer(invocationOnMock -> {
+ var id = invocationOnMock.getArgument(0, Integer.class);
+ var patient = new Patient(onkostarApi);
+ patient.setId(id);
+ return patient;
+ }).when(onkostarApi).getPatient(anyInt());
+
+ dnpmHelper.getEcogStatus(Map.of("PatientId", 42));
+
+ var argumentCaptor = ArgumentCaptor.forClass(Patient.class);
+ verify(systemtherapieService, times(1)).ecogSatus(argumentCaptor.capture());
+ assertThat(argumentCaptor.getValue()).isNotNull();
+ assertThat(argumentCaptor.getValue().getId()).isEqualTo(42);
+ }
+
}
}
--
cgit v1.2.3
From 862e4813730acd47e123730286c8e5f3c8ed8085 Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer
Date: Wed, 12 Jul 2023 10:35:21 +0200
Subject: Issue #29: Möglicher Wert "0" hinzugefügt
---
src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java b/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java
index 0102fc6..a664c05 100644
--- a/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java
+++ b/src/main/java/DNPM/services/systemtherapie/SystemtherapieService.java
@@ -60,6 +60,7 @@ public interface SystemtherapieService {
private boolean isValidEcogCode(String status) {
switch (status) {
+ case "0":
case "1":
case "2":
case "3":
--
cgit v1.2.3
From 9389acdf641016eaf9d9b217ce7d28866a1e9263 Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer
Date: Wed, 12 Jul 2023 12:55:07 +0200
Subject: Issue #29: Füge neuer ECOG Einträge in DNPM Klinik/Anamnese ein
Es werden lediglich neue Einträge hinzugefügt, betrachtet wird hierbei das
Datum der Feststellung und abgeschlossene Formulare Systemische Therapie.
Es werden *keine* Einträge nachträglich verändert.
---
.../java/DNPM/analyzer/SystemtherapieAnalyzer.java | 142 +++++++++++++++++++++
1 file changed, 142 insertions(+)
create mode 100644 src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java
diff --git a/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java
new file mode 100644
index 0000000..78f2c84
--- /dev/null
+++ b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java
@@ -0,0 +1,142 @@
+package DNPM.analyzer;
+
+import DNPM.services.systemtherapie.SystemtherapieService;
+import de.itc.onkostar.api.Disease;
+import de.itc.onkostar.api.IOnkostarApi;
+import de.itc.onkostar.api.Item;
+import de.itc.onkostar.api.Procedure;
+import de.itc.onkostar.api.analysis.AnalyseTriggerEvent;
+import de.itc.onkostar.api.analysis.AnalyzerRequirement;
+import de.itc.onkostar.api.analysis.IProcedureAnalyzer;
+import de.itc.onkostar.api.analysis.OnkostarPluginType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Diese Klasse implementiert ein Plugin, welches Aktionen nach Bearbeitung eines Formulars zur Systemtherapie durchführt.
+ *
+ * @since 0.4.0
+ */
+@Component
+public class SystemtherapieAnalyzer implements IProcedureAnalyzer {
+
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ private final IOnkostarApi onkostarApi;
+
+ private final SystemtherapieService systemtherapieService;
+
+ public SystemtherapieAnalyzer(
+ final IOnkostarApi onkostarApi,
+ final SystemtherapieService systemtherapieService
+ ) {
+ this.onkostarApi = onkostarApi;
+ this.systemtherapieService = systemtherapieService;
+ }
+
+ @Override
+ public OnkostarPluginType getType() {
+ return OnkostarPluginType.ANALYZER;
+ }
+
+ @Override
+ public String getVersion() {
+ return "0.4.0";
+ }
+
+ @Override
+ public String getName() {
+ return "DNPM Systemtherapie Analyzer";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Aktualisiert verknüpfte Formulare nach Änderungen im Formularen vom Typ Systemtherapie";
+ }
+
+ /**
+ * @deprecated
+ */
+ @Override
+ public boolean isRelevantForDeletedProcedure() {
+ return true;
+ }
+
+ @Override
+ public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) {
+ return null != procedure && (
+ procedure.getFormName().equals("OS.Systemische Therapie")
+ || procedure.getFormName().equals("OS.Systemische Therapie.VarianteUKW")
+ );
+ }
+
+ @Override
+ public boolean isSynchronous() {
+ return false;
+ }
+
+ @Override
+ public AnalyzerRequirement getRequirement() {
+ return AnalyzerRequirement.PROCEDURE;
+ }
+
+ @Override
+ public Set getTriggerEvents() {
+ return Set.of(
+ AnalyseTriggerEvent.EDIT_SAVE,
+ AnalyseTriggerEvent.EDIT_LOCK,
+ AnalyseTriggerEvent.REORG
+ );
+ }
+
+ @Override
+ public void analyze(Procedure procedure, Disease disease) {
+ var date = procedure.getStartDate();
+ var status = procedure.getValue("ECOGvorTherapie");
+
+ if (null == date || null == status) {
+ // Ignore
+ return;
+ }
+
+ var ecogFromCompleted = systemtherapieService.ecogSatus(procedure.getPatient());
+
+ procedure.getPatient().getDiseases().stream()
+ .flatMap(d -> onkostarApi.getProceduresForDiseaseByForm(d.getId(), "DNPM Klinik/Anamnese").stream())
+ .forEach(p -> {
+ var ufEcog = p.getValue("ECOGVerlauf");
+ if (null != ufEcog && ufEcog.getValue() instanceof List) {
+ var shouldSave = false;
+ var existingDates = ((List