From cc97004b302cf1fb5bf5b6f1de63cd6dcb1137fd Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Sat, 27 Jul 2024 01:10:48 +0200 Subject: [PATCH] [#3] ElwigData: Fix importing of duplicate data --- Elwig/Helpers/Export/ElwigData.cs | 57 +++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs index 288c576..03af552 100644 --- a/Elwig/Helpers/Export/ElwigData.cs +++ b/Elwig/Helpers/Export/ElwigData.cs @@ -24,7 +24,7 @@ namespace Elwig.Helpers.Export { } } - public static async Task AddImportedFiles(IEnumerable filenames) { + public static async Task AddImportedFiles(params string[] filenames) { await File.AppendAllLinesAsync(ImportedTxt, filenames, Utils.UTF8); } @@ -32,14 +32,22 @@ namespace Elwig.Helpers.Export { public static async Task Import(IEnumerable filenames, ImportMode mode) { try { - using var ctx = new AppDbContext(); - var branches = await ctx.Branches.ToDictionaryAsync(b => b.ZwstId); - var currentDids = await ctx.Deliveries - .GroupBy(d => d.Year) - .ToDictionaryAsync(g => g.Key, g => g.Max(d => d.DId)); - var currentWbRde = await ctx.WbRde - .GroupBy(r => r.KgNr) - .ToDictionaryAsync(g => g.Key, g => g.ToList()); + Dictionary branches; + Dictionary currentDids; + Dictionary currentLsNrs; + Dictionary> currentWbRde; + + using (var ctx = new AppDbContext()) { + branches = await ctx.Branches.ToDictionaryAsync(b => b.ZwstId); + currentDids = await ctx.Deliveries + .GroupBy(d => d.Year) + .ToDictionaryAsync(g => g.Key, g => g.Max(d => d.DId)); + currentLsNrs = await ctx.Deliveries + .ToDictionaryAsync(d => d.LsNr, d => d.DId); + currentWbRde = await ctx.WbRde + .GroupBy(r => r.KgNr) + .ToDictionaryAsync(g => g.Key, g => g.ToList()); + } var data = new List<( List Members, @@ -116,7 +124,7 @@ namespace Elwig.Helpers.Export { string? line; while ((line = await reader.ReadLineAsync()) != null) { var obj = JsonNode.Parse(line)!.AsObject(); - var (d, parts, mods) = obj.ToDelivery(currentDids); + var (d, parts, mods) = obj.ToDelivery(currentLsNrs, currentDids); r.Deliveries.Add(d); r.DeliveryParts.AddRange(parts); r.Modifiers.AddRange(mods); @@ -131,6 +139,8 @@ namespace Elwig.Helpers.Export { var branch = branches[meta.ZwstId]; var device = meta.Device; + using var ctx = new AppDbContext(); + var mgnrs = members.Select(m => m.MgNr).ToList(); var duplicateMgNrs = await ctx.Members .Where(m => mgnrs.Contains(m.MgNr)) @@ -204,6 +214,9 @@ namespace Elwig.Helpers.Export { .Where(d => allowedDuplicateLsNrs.Contains(d.LsNr)) .Select(d => (d.Year, d.DId)) .ToList(); + ctx.RemoveRange(ctx.DeliveryParts + .Where(p => allowedDuplicateLsNrs.Contains(p.Delivery.LsNr)) + .SelectMany(p => p.PartModifiers)); ctx.RemoveRange(ctx.DeliveryParts.Where(p => allowedDuplicateLsNrs.Contains(p.Delivery.LsNr))); ctx.UpdateRange(deliveries.Where(d => dids.Contains((d.Year, d.DId)))); ctx.AddRange(deliveryParts.Where(p => dids.Contains((p.Year, p.DId)))); @@ -215,6 +228,9 @@ namespace Elwig.Helpers.Export { .Where(d => l.Contains(d.LsNr)) .Select(d => (d.Year, d.DId)) .ToList(); + ctx.RemoveRange(ctx.DeliveryParts + .Where(p => l.Contains(p.Delivery.LsNr)) + .SelectMany(p => p.PartModifiers)); ctx.RemoveRange(ctx.DeliveryParts.Where(p => l.Contains(p.Delivery.LsNr))); ctx.UpdateRange(deliveries.Where(d => dids.Contains((d.Year, d.DId)))); ctx.AddRange(deliveryParts.Where(p => dids.Contains((p.Year, p.DId)))); @@ -231,10 +247,8 @@ namespace Elwig.Helpers.Export { importedDeliveries.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, deliveries.Count - n - o, meta.DeliveryFilters)); } - try { - await ctx.SaveChangesAsync(); - } catch (DbUpdateConcurrencyException) { } - await AddImportedFiles(filenames.Select(f => Path.GetFileName(f))); + await ctx.SaveChangesAsync(); + await AddImportedFiles(Path.GetFileName(meta.FileName)); } await App.HintContextChange(); @@ -258,8 +272,12 @@ namespace Elwig.Helpers.Export { "Importieren erfolgreich", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; + if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; + MessageBox.Show(str, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } + GC.Collect(); + GC.WaitForPendingFinalizers(); } private static bool ImportQuestion(string branch, string device, string subject, bool duplicate, int number) { @@ -549,9 +567,12 @@ namespace Elwig.Helpers.Export { }; } - public static (Delivery, List, List) ToDelivery(this JsonNode json, Dictionary currentDids) { + public static (Delivery, List, List) ToDelivery(this JsonNode json, Dictionary currentLsNrs, Dictionary currentDids) { var year = json["year"]!.AsValue().GetValue(); - var did = ++currentDids[year]; + var lsnr = json["lsnr"]!.AsValue().GetValue(); + var did = currentLsNrs.GetValueOrDefault(lsnr, -1); + if (did == -1) did = ++currentDids[year]; + currentLsNrs[lsnr] = did; return (new Delivery { Year = year, DId = did, @@ -559,7 +580,7 @@ namespace Elwig.Helpers.Export { TimeString = json["time"]?.AsValue().GetValue(), ZwstId = json["zwstid"]!.AsValue().GetValue(), LNr = json["lnr"]!.AsValue().GetValue(), - LsNr = json["lsnr"]!.AsValue().GetValue(), + LsNr = lsnr, MgNr = json["mgnr"]!.AsValue().GetValue(), Comment = json["comment"]?.AsValue().GetValue(), }, json["parts"]!.AsArray().Select(p => p!.AsObject()).Select(p => new DeliveryPart {