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:
+1
-1
@@ -31,7 +31,7 @@ class ZnsImportController(
|
||||
@RequestParam("mode", defaultValue = "FULL") mode: ZnsImportMode
|
||||
): ResponseEntity<ImportStartResponse> {
|
||||
val job = jobRegistry.erstelleJob()
|
||||
orchestrator.starteImport(job.jobId, file.bytes, mode)
|
||||
orchestrator.starteImport(job.jobId, file.bytes, file.originalFilename ?: "zns_import.zip", mode)
|
||||
return ResponseEntity.status(HttpStatus.ACCEPTED).body(ImportStartResponse(job.jobId))
|
||||
}
|
||||
|
||||
|
||||
+21
-19
@@ -13,10 +13,8 @@ import org.jetbrains.exposed.v1.migration.jdbc.MigrationUtils
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.beans.factory.annotation.Value
|
||||
import org.springframework.context.annotation.Configuration
|
||||
import org.springframework.context.annotation.Profile
|
||||
|
||||
@Configuration
|
||||
@Profile("dev")
|
||||
class ZnsImportDatabaseConfiguration(
|
||||
@Value("\${spring.datasource.url}") private val jdbcUrl: String,
|
||||
@Value("\${spring.datasource.username}") private val username: String,
|
||||
@@ -26,23 +24,27 @@ class ZnsImportDatabaseConfiguration(
|
||||
|
||||
@PostConstruct
|
||||
fun initializeDatabase() {
|
||||
log.info("Initialisiere Datenbank-Schema für ZNS-Import-Service...")
|
||||
Database.connect(jdbcUrl, user = username, password = password)
|
||||
transaction {
|
||||
val statements = MigrationUtils.statementsRequiredForDatabaseMigration(
|
||||
VereinTable,
|
||||
ReiterTable,
|
||||
HorseTable,
|
||||
FunktionaerTable,
|
||||
FunktionaersQualifikationenTable,
|
||||
FunktionaerQualifikationTable,
|
||||
ReitLizenzenTable,
|
||||
FahrLizenzenTable,
|
||||
StartkartenTable,
|
||||
ReiterLizenzenZuordnungTable
|
||||
)
|
||||
statements.forEach { exec(it) }
|
||||
log.info("Datenbank-Schema erfolgreich initialisiert ({} Statements)", statements.size)
|
||||
log.info("Initialisiere Datenbank-Schema für ZNS-Import-Service (JDBC: {})...", jdbcUrl)
|
||||
try {
|
||||
Database.connect(jdbcUrl, user = username, password = password)
|
||||
transaction {
|
||||
val statements = MigrationUtils.statementsRequiredForDatabaseMigration(
|
||||
VereinTable,
|
||||
ReiterTable,
|
||||
HorseTable,
|
||||
FunktionaerTable,
|
||||
FunktionaersQualifikationenTable,
|
||||
FunktionaerQualifikationTable,
|
||||
ReitLizenzenTable,
|
||||
FahrLizenzenTable,
|
||||
StartkartenTable,
|
||||
ReiterLizenzenZuordnungTable
|
||||
)
|
||||
statements.forEach { exec(it) }
|
||||
log.info("Datenbank-Schema erfolgreich initialisiert ({} Statements)", statements.size)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
log.error("Fehler bei der Datenbank-Initialisierung: {}", e.message, e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+20
-7
@@ -19,16 +19,22 @@ class ZnsImportOrchestrator(
|
||||
) {
|
||||
private val scope = CoroutineScope(Dispatchers.IO)
|
||||
|
||||
fun starteImport(jobId: String, zipBytes: ByteArray, mode: ZnsImportMode = ZnsImportMode.FULL) {
|
||||
fun starteImport(jobId: String, bytes: ByteArray, fileName: String, mode: ZnsImportMode = ZnsImportMode.FULL) {
|
||||
scope.launch {
|
||||
runCatching {
|
||||
jobRegistry.aktualisiereStatus(jobId, ImportJobStatus.ENTPACKEN, "Entpacke ZIP-Datei...", 5)
|
||||
println("[DEBUG_LOG] Starte Import Job $jobId (File: $fileName, Size: ${bytes.size} bytes)")
|
||||
jobRegistry.aktualisiereStatus(jobId, ImportJobStatus.ENTPACKEN, "Bereite Datei vor...", 5)
|
||||
|
||||
// Archivierung
|
||||
archiviereZip(zipBytes)
|
||||
archiviereDatei(bytes, fileName)
|
||||
|
||||
jobRegistry.aktualisiereStatus(jobId, ImportJobStatus.VERARBEITUNG, "Verarbeite ZNS-Daten...", 20)
|
||||
val result = service.importiereZip(zipBytes.inputStream(), mode)
|
||||
val result = service.importiereStream(bytes.inputStream(), fileName, mode)
|
||||
|
||||
println("[DEBUG_LOG] Import Ergebnis: ${result.zusammenfassung()}")
|
||||
if (result.fehler.isNotEmpty()) {
|
||||
println("[DEBUG_LOG] Fehler im Import: ${result.fehler.joinToString()}")
|
||||
}
|
||||
|
||||
jobRegistry.aktualisiereStatus(
|
||||
jobId, ImportJobStatus.ABGESCHLOSSEN,
|
||||
@@ -40,20 +46,27 @@ class ZnsImportOrchestrator(
|
||||
job.warnungen.addAll(result.warnungen)
|
||||
}
|
||||
}.onFailure { ex ->
|
||||
println("[DEBUG_LOG] Kritischer Fehler im ZnsImportOrchestrator: ${ex.message}")
|
||||
ex.printStackTrace()
|
||||
jobRegistry.aktualisiereStatus(jobId, ImportJobStatus.FEHLER, "Fehler: ${ex.message}")
|
||||
jobRegistry.findeJob(jobId)?.fehler?.add(ex.message ?: "Unbekannter Fehler")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun archiviereZip(bytes: ByteArray) {
|
||||
private fun archiviereDatei(bytes: ByteArray, originalFileName: String) {
|
||||
try {
|
||||
val dir = File(archivePath)
|
||||
if (!dir.exists()) dir.mkdirs()
|
||||
if (!dir.exists()) {
|
||||
val success = dir.mkdirs()
|
||||
println("[DEBUG_LOG] Archiv-Verzeichnis erstellt ($archivePath): $success")
|
||||
}
|
||||
|
||||
val timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"))
|
||||
val archiveFile = File(dir, "zns_import_$timestamp.zip")
|
||||
val extension = originalFileName.substringAfterLast(".", "bin")
|
||||
val archiveFile = File(dir, "zns_import_${timestamp}.$extension")
|
||||
archiveFile.writeBytes(bytes)
|
||||
println("[DEBUG_LOG] Datei archiviert: ${archiveFile.absolutePath}")
|
||||
} catch (e: Exception) {
|
||||
// Archivierung schlägt fehl -> Loggen aber Import nicht abbrechen
|
||||
println("[WARN] Archivierung der ZNS-Datei fehlgeschlagen: ${e.message}")
|
||||
|
||||
Reference in New Issue
Block a user