feat: unterstütze Einzeldatei-Import, verbessere Fortschrittsanzeige und Logging im ZNS-Import
Signed-off-by: StefanMoCoAt <stefan.mo.co@gmail.com>
This commit is contained in:
+101
-7
@@ -67,8 +67,8 @@ class ZnsImportService(
|
||||
|
||||
if (fileName in setOf(FILE_VEREIN, FILE_LIZENZ, FILE_PFERDE, FILE_RICHT)) {
|
||||
// Wir lesen den Stream direkt zeilenweise mit dem korrekten Encoding
|
||||
val reader = zip.bufferedReader(CP850)
|
||||
val lines = mutableListOf<String>()
|
||||
val reader = zip.bufferedReader(CP850)
|
||||
|
||||
// WICHTIG: Wir dürfen den Reader NICHT schließen (use), da sonst der ZipInputStream geschlossen wird!
|
||||
var line = reader.readLine()
|
||||
@@ -78,17 +78,103 @@ class ZnsImportService(
|
||||
}
|
||||
line = reader.readLine()
|
||||
}
|
||||
println("[DEBUG_LOG] Datei $fileName extrahiert: ${lines.size} Zeilen")
|
||||
dateien[fileName] = lines
|
||||
}
|
||||
zip.closeEntry()
|
||||
entry = zip.nextEntry
|
||||
}
|
||||
} finally {
|
||||
// Wir schließen den ZipInputStream NICHT hier, sondern überlassen es dem Aufrufer
|
||||
} catch (e: Exception) {
|
||||
println("[DEBUG_LOG] Fehler beim Extrahieren der ZIP (eventuell keine ZIP-Datei?): ${e.message}")
|
||||
}
|
||||
return dateien
|
||||
}
|
||||
|
||||
/**
|
||||
* Importiert ZNS-Daten aus einem Stream. Erkennt automatisch, ob es eine ZIP oder eine DAT ist.
|
||||
*/
|
||||
suspend fun importiereStream(
|
||||
inputStream: InputStream,
|
||||
fileName: String,
|
||||
mode: ZnsImportMode = ZnsImportMode.FULL
|
||||
): ZnsImportResult {
|
||||
val upperName = fileName.uppercase()
|
||||
return if (upperName.endsWith(".ZIP")) {
|
||||
importiereZip(inputStream, mode)
|
||||
} else if (upperName.endsWith(".DAT")) {
|
||||
importiereEinzelDatei(inputStream, upperName, mode)
|
||||
} else {
|
||||
ZnsImportResult(fehler = listOf("Dateiformat nicht unterstützt: $fileName"))
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun importiereEinzelDatei(
|
||||
inputStream: InputStream,
|
||||
fileName: String,
|
||||
mode: ZnsImportMode
|
||||
): ZnsImportResult {
|
||||
println("[DEBUG_LOG] Importiere Einzeldatei: $fileName")
|
||||
val lines = inputStream.bufferedReader(CP850).readLines().filter { it.isNotBlank() }
|
||||
println("[DEBUG_LOG] Einzeldatei $fileName hat ${lines.size} Zeilen")
|
||||
|
||||
val fehler = mutableListOf<String>()
|
||||
val warnungen = mutableListOf<String>()
|
||||
|
||||
var vereineImportiert = 0
|
||||
var vereineAktualisiert = 0
|
||||
var reiterImportiert = 0
|
||||
var reiterAktualisiert = 0
|
||||
var pferdeImportiert = 0
|
||||
var pferdeAktualisiert = 0
|
||||
var richterImportiert = 0
|
||||
var richterAktualisiert = 0
|
||||
|
||||
when (fileName) {
|
||||
FILE_VEREIN -> {
|
||||
val (n, u) = importiereVereine(lines, fehler)
|
||||
vereineImportiert = n
|
||||
vereineAktualisiert = u
|
||||
}
|
||||
|
||||
FILE_LIZENZ -> {
|
||||
val (n, u) = importiereReiter(lines, fehler, warnungen)
|
||||
reiterImportiert = n
|
||||
reiterAktualisiert = u
|
||||
}
|
||||
|
||||
FILE_PFERDE -> {
|
||||
if (mode == ZnsImportMode.FULL) {
|
||||
val (n, u) = importierePferde(lines, fehler)
|
||||
pferdeImportiert = n
|
||||
pferdeAktualisiert = u
|
||||
}
|
||||
}
|
||||
|
||||
FILE_RICHT -> {
|
||||
if (mode == ZnsImportMode.FULL) {
|
||||
val (n, u) = importiereFunktionaere(lines, fehler, warnungen)
|
||||
richterImportiert = n
|
||||
richterAktualisiert = u
|
||||
}
|
||||
}
|
||||
|
||||
else -> fehler.add("Unbekannte DAT-Datei: $fileName")
|
||||
}
|
||||
|
||||
return ZnsImportResult(
|
||||
vereineImportiert = vereineImportiert,
|
||||
vereineAktualisiert = vereineAktualisiert,
|
||||
reiterImportiert = reiterImportiert,
|
||||
reiterAktualisiert = reiterAktualisiert,
|
||||
pferdeImportiert = pferdeImportiert,
|
||||
pferdeAktualisiert = pferdeAktualisiert,
|
||||
richterImportiert = richterImportiert,
|
||||
richterAktualisiert = richterAktualisiert,
|
||||
fehler = fehler,
|
||||
warnungen = warnungen
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Importiert eine ZNS-ZIP-Datei aus einem [InputStream].
|
||||
*
|
||||
@@ -101,8 +187,8 @@ class ZnsImportService(
|
||||
mode: ZnsImportMode = ZnsImportMode.FULL
|
||||
): ZnsImportResult {
|
||||
val dateien = extrahiereDateien(zipInputStream)
|
||||
// println("[DEBUG_LOG] Gefundene Dateien: ${dateien.keys}")
|
||||
// dateien.forEach { (name, lines) -> println("[DEBUG_LOG] Datei $name hat ${lines.size} Zeilen") }
|
||||
println("[DEBUG_LOG] Gefundene Dateien im ZIP: ${dateien.keys}")
|
||||
dateien.forEach { (name, lines) -> println("[DEBUG_LOG] Datei $name hat ${lines.size} Zeilen") }
|
||||
|
||||
val fehler = mutableListOf<String>()
|
||||
val warnungen = mutableListOf<String>()
|
||||
@@ -151,7 +237,11 @@ class ZnsImportService(
|
||||
var aktualisiert = 0
|
||||
zeilen.forEachIndexed { index, zeile ->
|
||||
runCatching {
|
||||
val verein = ZnsVereinParser.parse(zeile) ?: return@forEachIndexed
|
||||
val verein = ZnsVereinParser.parse(zeile)
|
||||
if (verein == null) {
|
||||
if (index < 5) println("[DEBUG_LOG] Parser lieferte null für Zeile ${index + 1}: '$zeile'")
|
||||
return@forEachIndexed
|
||||
}
|
||||
val vorhanden = vereinRepository.findByVereinsNummer(verein.vereinsNummer)
|
||||
if (vorhanden == null) {
|
||||
vereinRepository.save(verein)
|
||||
@@ -186,7 +276,11 @@ class ZnsImportService(
|
||||
var aktualisiert = 0
|
||||
zeilen.forEachIndexed { index, zeile ->
|
||||
runCatching {
|
||||
val parsed = ZnsReiterParser.parse(zeile) ?: return@forEachIndexed
|
||||
val parsed = ZnsReiterParser.parse(zeile)
|
||||
if (parsed == null) {
|
||||
if (index < 5) println("[DEBUG_LOG] Reiter-Parser lieferte null für Zeile ${index + 1}: '$zeile'")
|
||||
return@forEachIndexed
|
||||
}
|
||||
|
||||
// Relationen auflösen
|
||||
val verein = parsed.vereinsName?.let { vereinRepository.findByExactName(it) }
|
||||
|
||||
Reference in New Issue
Block a user