package com.hilotec.elexis.kgview.data; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import ch.elexis.core.data.interfaces.IDataAccess; import ch.elexis.data.Konsultation; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.data.Prescription; import ch.rgw.tools.Result; import ch.rgw.tools.StringTool; import com.hilotec.elexis.kgview.ArchivKG; import com.hilotec.elexis.kgview.Preferences; import com.hilotec.elexis.kgview.diagnoseliste.DiagnoselisteItem; import com.hilotec.elexis.kgview.medikarte.MedikarteEintragComparator; import com.hilotec.elexis.kgview.medikarte.MedikarteEintragComparator.Sortierung; import com.hilotec.elexis.kgview.medikarte.MedikarteHelpers; public class DataAccessor implements IDataAccess { private static final String[] fields = { "JetzigesLeiden", "JetzigesLeidenICPC", "AllgStatus", "LokStatus", "Prozedere", "ProzedereICPC", "Diagnose", "DiagnoseICPC" }; public String getName(){ return "Hilotec-KG"; } public String getDescription(){ return "Daten aus dem Hilotec-KG-Plugin"; } public List<Element> getList(){ ArrayList<Element> res = new ArrayList<Element>(fields.length); for (String s : fields) { res.add(new Element(IDataAccess.TYPE.STRING, s, s, Konsultation.class, 0)); } return res; } private String[] emptyRow(int count){ String[] row = new String[count]; for (int i = 0; i < row.length; i++) row[i] = ""; return row; } private Result<Object> generiereMedikarte(Patient pat){ List<Prescription> l = MedikarteHelpers.medikarteMedikation(pat, false); // Spezialfall: keine Eintraege if (l.isEmpty()) return new Result<Object>(new String[0][]); // Liste aller Einnahmevorschriften und Medis gruppiert nach EV SortedSet<String> evs = new TreeSet<String>(); HashMap<String, List<Prescription>> prescs = new HashMap<String, List<Prescription>>(); for (Prescription p : l) { String ev = p.getBemerkung(); evs.add(ev); if (!prescs.containsKey(ev)) prescs.put(ev, new ArrayList<Prescription>()); prescs.get(ev).add(p); } // Die einzelnen Listen nach Ordnungszahl sortieren for (String ev : evs) { List<Prescription> pl = prescs.get(ev); Collections.sort(pl, new MedikarteEintragComparator(Sortierung.ORDNUNGSZAHL)); } // Zeilen fuer Spaltenueberschriften zaehlen int extra = 2 * evs.size() - (evs.contains("") ? 2 : 1); String[][] res = new String[l.size() + extra][]; // Einnahmevorschriften Sortieren String evs_ordered[] = new String[evs.size()]; int i = 0; // Zuerst Medikamente ohne Vorschrift if (evs.contains("")) { evs_ordered[i++] = ""; evs.remove(""); } // Dann die konfigurierten Vorschriften in der konfigurierten // Reihenfolge String evs_config[] = Preferences.getEinnahmevorschriften(); for (String ev : evs_config) { if (evs.contains(ev)) { evs_ordered[i++] = ev; evs.remove(ev); } } // Am schluss noch der Rest alphabetisch for (String ev : evs) { evs_ordered[i++] = ev; evs.remove(ev); } // Tabelle Generieren i = 0; for (String ev : evs_ordered) { // Ueberschrift if (i != 0) res[i++] = emptyRow(7); if (!ev.equals("")) { String[] row = emptyRow(7); row[0] = "_" + ev + "_"; res[i++] = row; } // Medikamente for (Prescription p : prescs.get(ev)) { FavMedikament fm = FavMedikament.load(p.getArtikel()); String[] dosierung = p.getDosis().split("-"); if (dosierung.length != 4 || fm == null) continue; String[] row = new String[7]; row[0] = fm.getBezeichnung(); row[5] = fm.getEinheit(); row[6] = MedikarteHelpers.getPZweck(p); row[1] = dosierung[0]; row[2] = dosierung[1]; row[3] = dosierung[2]; row[4] = dosierung[3]; res[i++] = row; } } return new Result<Object>(res); } /** Tiefe des Baums, nur Wurzel hat Tiefe 1. */ private int dliDepth(DiagnoselisteItem item){ if (item == null) return 0; int depth = 0; for (DiagnoselisteItem child : item.getChildren()) { depth = Math.max(dliDepth(child), depth); } return depth + 1; } /** * Generiere Zeile fuer ein DLI, und dessen Unteritems. * * @param item * Item fuer das eine Zeile generiert werden soll. * @param skip * Anzahl der Spalten am Anfang zu ueberspringen * @param ignore * Nur fuer Unterelemente generieren. * @param dest * Liste in der die Zeilen abgelegt werden sollen. */ private void generiereDLIZeilen(DiagnoselisteItem item, int skip, boolean ignore, List<String[]> dest){ if (!ignore) { skip++; String[] zeile = new String[skip]; zeile[skip - 1] = item.getText(); dest.add(zeile); } for (DiagnoselisteItem child : item.getChildren()) { generiereDLIZeilen(child, skip, false, dest); } } private Result<Object> generiereDiagnoseliste(Patient pat){ // TODO: Waere schoen wenn wir den Baum hier nicht 2x traversieren // muessten. DiagnoselisteItem root = DiagnoselisteItem.getRoot(pat, DiagnoselisteItem.TYP_DIAGNOSELISTE); int depth = dliDepth(root); // Nur Wurzel oder weniger -> abbrechen. if (depth <= 1) { return new Result<Object>(""); } List<String[]> rows = new ArrayList<String[]>(); generiereDLIZeilen(root, 0, true, rows); // Resultat in Array umwandeln String[][] res = new String[rows.size()][]; int i = 0; for (String[] row : rows) { res[i++] = row; } return new Result<Object>(res); } /** * Problemlistentabelle generieren */ private Result<Object> generiereProblemliste(Patient pat){ ArrayList<String[]> pl = new ArrayList<String[]>(); List<Konsultation> kl = ArchivKG.getKonsultationen(pat, false); for (Konsultation k : kl) { KonsData kd = KonsData.load(k); if (kd == null || StringTool.isNothing(kd.getDiagnose())) continue; pl.add(new String[] { k.getDatum(), kd.getDiagnose() }); } // In Array umwandeln return new Result<Object>(pl.toArray(new String[pl.size()][])); } public Result<Object> getObject(String descriptor, PersistentObject dependentObject, String dates, String[] params){ if (dependentObject instanceof Patient && descriptor.equals("Medikarte")) { return generiereMedikarte((Patient) dependentObject); } else if (dependentObject instanceof Patient && descriptor.equals("Medikarte.Datum")) { return new Result<Object>(MedikarteHelpers.medikarteDatum((Patient) dependentObject)); } else if (dependentObject instanceof Patient && descriptor.equals("Diagnoseliste")) { return generiereDiagnoseliste((Patient) dependentObject); } else if (dependentObject instanceof Patient && descriptor.equals("Problemliste")) { return generiereProblemliste((Patient) dependentObject); } if (!(dependentObject instanceof Konsultation)) { return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS, "Ungültiger Parameter", dependentObject, true); } Konsultation kons = (Konsultation) dependentObject; KonsData data = new KonsData(kons); for (String f : fields) { if (f.equals(descriptor)) { return new Result<Object>(StringTool.unNull(data.get(f))); } } return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS, "Ungültiges Feld", dependentObject, true); } }