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 (limited to 'src/main/java/DNPM/analyzer') 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>) ufEcog.getValue()).stream() + .map(v -> v.get("Datum").toString()) + .collect(Collectors.toList()); + for (var ecog : ecogFromCompleted) { + var formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(ecog.getDate()); + if (! existingDates.contains(formattedDate)) { + var newSubProcedure = new Procedure(onkostarApi); + newSubProcedure.setStartDate(ecog.getDate()); + newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); + newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); + p.addSubProcedure("ECOGVerlauf", newSubProcedure); + shouldSave = true; + } + } + if (shouldSave) { + try { + onkostarApi.saveProcedure(p, true); + } catch (Exception e) { + logger.error("Cannot update ECOG for procedure '{}'", p.getId()); + } + } + } + }); + } + +} -- cgit v1.2.3 From 27476863809d4f2a0a704afd3a2a30f3feafdde4 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Wed, 12 Jul 2023 14:52:09 +0200 Subject: Issue #29: Tests für das Einfügen in ECOG Verlauf --- .../java/DNPM/analyzer/SystemtherapieAnalyzer.java | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'src/main/java/DNPM/analyzer') diff --git a/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java index 78f2c84..cf7dea8 100644 --- a/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java +++ b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java @@ -107,6 +107,10 @@ public class SystemtherapieAnalyzer implements IProcedureAnalyzer { } var ecogFromCompleted = systemtherapieService.ecogSatus(procedure.getPatient()); + if (ecogFromCompleted.isEmpty()) { + // Nothing to do + return; + } procedure.getPatient().getDiseases().stream() .flatMap(d -> onkostarApi.getProceduresForDiseaseByForm(d.getId(), "DNPM Klinik/Anamnese").stream()) @@ -114,8 +118,8 @@ public class SystemtherapieAnalyzer implements IProcedureAnalyzer { var ufEcog = p.getValue("ECOGVerlauf"); if (null != ufEcog && ufEcog.getValue() instanceof List) { var shouldSave = false; - var existingDates = ((List>) ufEcog.getValue()).stream() - .map(v -> v.get("Datum").toString()) + var existingDates = ufEcog.>>getValue().stream() + .map(v -> v.get("Datum")) .collect(Collectors.toList()); for (var ecog : ecogFromCompleted) { var formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(ecog.getDate()); @@ -135,6 +139,20 @@ public class SystemtherapieAnalyzer implements IProcedureAnalyzer { logger.error("Cannot update ECOG for procedure '{}'", p.getId()); } } + } else { + p.setValue("ECOGVerlauf", new Item("ECOGVerlauf", List.of())); + for (var ecog : ecogFromCompleted) { + var newSubProcedure = new Procedure(onkostarApi); + newSubProcedure.setStartDate(ecog.getDate()); + newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); + newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); + p.addSubProcedure("ECOGVerlauf", newSubProcedure); + } + try { + onkostarApi.saveProcedure(p, true); + } catch (Exception e) { + logger.error("Create update ECOG for procedure '{}'", p.getId()); + } } }); } -- cgit v1.2.3 From cf9a68f6cd1a689145c52728309269e466c0113e Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Mon, 28 Aug 2023 11:51:46 +0200 Subject: Issue #29: Methoden zum Anlegen und Aktualisieren des Ecog-Verlaufs extrahiert --- .../java/DNPM/analyzer/SystemtherapieAnalyzer.java | 80 ++++++++++++---------- 1 file changed, 44 insertions(+), 36 deletions(-) (limited to 'src/main/java/DNPM/analyzer') diff --git a/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java index cf7dea8..16fe577 100644 --- a/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java +++ b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java @@ -73,7 +73,7 @@ public class SystemtherapieAnalyzer implements IProcedureAnalyzer { public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { return null != procedure && ( procedure.getFormName().equals("OS.Systemische Therapie") - || procedure.getFormName().equals("OS.Systemische Therapie.VarianteUKW") + || procedure.getFormName().equals("OS.Systemische Therapie.VarianteUKW") ); } @@ -117,44 +117,52 @@ public class SystemtherapieAnalyzer implements IProcedureAnalyzer { .forEach(p -> { var ufEcog = p.getValue("ECOGVerlauf"); if (null != ufEcog && ufEcog.getValue() instanceof List) { - var shouldSave = false; - var existingDates = ufEcog.>>getValue().stream() - .map(v -> v.get("Datum")) - .collect(Collectors.toList()); - for (var ecog : ecogFromCompleted) { - var formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(ecog.getDate()); - if (! existingDates.contains(formattedDate)) { - var newSubProcedure = new Procedure(onkostarApi); - newSubProcedure.setStartDate(ecog.getDate()); - newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); - newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); - p.addSubProcedure("ECOGVerlauf", newSubProcedure); - shouldSave = true; - } - } - if (shouldSave) { - try { - onkostarApi.saveProcedure(p, true); - } catch (Exception e) { - logger.error("Cannot update ECOG for procedure '{}'", p.getId()); - } - } + updateExistingEcogVerlauf(p, ecogFromCompleted, ufEcog); } else { - p.setValue("ECOGVerlauf", new Item("ECOGVerlauf", List.of())); - for (var ecog : ecogFromCompleted) { - var newSubProcedure = new Procedure(onkostarApi); - newSubProcedure.setStartDate(ecog.getDate()); - newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); - newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); - p.addSubProcedure("ECOGVerlauf", newSubProcedure); - } - try { - onkostarApi.saveProcedure(p, true); - } catch (Exception e) { - logger.error("Create update ECOG for procedure '{}'", p.getId()); - } + newEcogverlauf(p, ecogFromCompleted); } }); } + private void updateExistingEcogVerlauf(Procedure p, List ecogFromCompleted, Item ufEcog) { + var shouldSave = false; + var existingDates = ufEcog.>>getValue().stream() + .map(v -> v.get("Datum")) + .collect(Collectors.toList()); + for (var ecog : ecogFromCompleted) { + var formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(ecog.getDate()); + if (!existingDates.contains(formattedDate)) { + var newSubProcedure = new Procedure(onkostarApi); + newSubProcedure.setStartDate(ecog.getDate()); + newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); + newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); + p.addSubProcedure("ECOGVerlauf", newSubProcedure); + shouldSave = true; + } + } + if (shouldSave) { + try { + onkostarApi.saveProcedure(p, true); + } catch (Exception e) { + logger.error("Cannot update ECOG for procedure '{}'", p.getId()); + } + } + } + + private void newEcogverlauf(Procedure p, List ecogFromCompleted) { + p.setValue("ECOGVerlauf", new Item("ECOGVerlauf", List.of())); + for (var ecog : ecogFromCompleted) { + var newSubProcedure = new Procedure(onkostarApi); + newSubProcedure.setStartDate(ecog.getDate()); + newSubProcedure.setValue("Datum", new Item("Datum", ecog.getDate())); + newSubProcedure.setValue("ECOG", new Item("ECOG", ecog.getStatus())); + p.addSubProcedure("ECOGVerlauf", newSubProcedure); + } + try { + onkostarApi.saveProcedure(p, true); + } catch (Exception e) { + logger.error("Create update ECOG for procedure '{}'", p.getId()); + } + } + } -- cgit v1.2.3 From aef9dd7889ddf03cc75f5d682a26380ac6fb75d3 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Mon, 28 Aug 2023 12:17:29 +0200 Subject: Issue #29: Aktualisiere keinen EcogStatus vor Diagnosedatum --- src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/main/java/DNPM/analyzer') diff --git a/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java index 16fe577..e0d3037 100644 --- a/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java +++ b/src/main/java/DNPM/analyzer/SystemtherapieAnalyzer.java @@ -71,7 +71,7 @@ public class SystemtherapieAnalyzer implements IProcedureAnalyzer { @Override public boolean isRelevantForAnalyzer(Procedure procedure, Disease disease) { - return null != procedure && ( + return null != procedure && null != disease && ( procedure.getFormName().equals("OS.Systemische Therapie") || procedure.getFormName().equals("OS.Systemische Therapie.VarianteUKW") ); @@ -106,7 +106,11 @@ public class SystemtherapieAnalyzer implements IProcedureAnalyzer { return; } - var ecogFromCompleted = systemtherapieService.ecogSatus(procedure.getPatient()); + var ecogFromCompleted = systemtherapieService.ecogSatus(procedure.getPatient()) + .stream() + .filter(ecogStatusWithDate -> ecogStatusWithDate.getDate().after(disease.getDiagnosisDate())) + .collect(Collectors.toList()); + if (ecogFromCompleted.isEmpty()) { // Nothing to do return; -- cgit v1.2.3