[#3] ElwigData: Fix importing of duplicate data
All checks were successful
Test / Run tests (push) Successful in 2m52s

This commit is contained in:
2024-07-27 01:10:48 +02:00
parent 935b31f6e3
commit cc97004b30

View File

@ -24,7 +24,7 @@ namespace Elwig.Helpers.Export {
} }
} }
public static async Task AddImportedFiles(IEnumerable<string> filenames) { public static async Task AddImportedFiles(params string[] filenames) {
await File.AppendAllLinesAsync(ImportedTxt, filenames, Utils.UTF8); await File.AppendAllLinesAsync(ImportedTxt, filenames, Utils.UTF8);
} }
@ -32,14 +32,22 @@ namespace Elwig.Helpers.Export {
public static async Task Import(IEnumerable<string> filenames, ImportMode mode) { public static async Task Import(IEnumerable<string> filenames, ImportMode mode) {
try { try {
using var ctx = new AppDbContext(); Dictionary<string, Branch> branches;
var branches = await ctx.Branches.ToDictionaryAsync(b => b.ZwstId); Dictionary<int, int> currentDids;
var currentDids = await ctx.Deliveries Dictionary<string, int> currentLsNrs;
Dictionary<int, List<WbRd>> currentWbRde;
using (var ctx = new AppDbContext()) {
branches = await ctx.Branches.ToDictionaryAsync(b => b.ZwstId);
currentDids = await ctx.Deliveries
.GroupBy(d => d.Year) .GroupBy(d => d.Year)
.ToDictionaryAsync(g => g.Key, g => g.Max(d => d.DId)); .ToDictionaryAsync(g => g.Key, g => g.Max(d => d.DId));
var currentWbRde = await ctx.WbRde currentLsNrs = await ctx.Deliveries
.ToDictionaryAsync(d => d.LsNr, d => d.DId);
currentWbRde = await ctx.WbRde
.GroupBy(r => r.KgNr) .GroupBy(r => r.KgNr)
.ToDictionaryAsync(g => g.Key, g => g.ToList()); .ToDictionaryAsync(g => g.Key, g => g.ToList());
}
var data = new List<( var data = new List<(
List<Member> Members, List<Member> Members,
@ -116,7 +124,7 @@ namespace Elwig.Helpers.Export {
string? line; string? line;
while ((line = await reader.ReadLineAsync()) != null) { while ((line = await reader.ReadLineAsync()) != null) {
var obj = JsonNode.Parse(line)!.AsObject(); 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.Deliveries.Add(d);
r.DeliveryParts.AddRange(parts); r.DeliveryParts.AddRange(parts);
r.Modifiers.AddRange(mods); r.Modifiers.AddRange(mods);
@ -131,6 +139,8 @@ namespace Elwig.Helpers.Export {
var branch = branches[meta.ZwstId]; var branch = branches[meta.ZwstId];
var device = meta.Device; var device = meta.Device;
using var ctx = new AppDbContext();
var mgnrs = members.Select(m => m.MgNr).ToList(); var mgnrs = members.Select(m => m.MgNr).ToList();
var duplicateMgNrs = await ctx.Members var duplicateMgNrs = await ctx.Members
.Where(m => mgnrs.Contains(m.MgNr)) .Where(m => mgnrs.Contains(m.MgNr))
@ -204,6 +214,9 @@ namespace Elwig.Helpers.Export {
.Where(d => allowedDuplicateLsNrs.Contains(d.LsNr)) .Where(d => allowedDuplicateLsNrs.Contains(d.LsNr))
.Select(d => (d.Year, d.DId)) .Select(d => (d.Year, d.DId))
.ToList(); .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.RemoveRange(ctx.DeliveryParts.Where(p => allowedDuplicateLsNrs.Contains(p.Delivery.LsNr)));
ctx.UpdateRange(deliveries.Where(d => dids.Contains((d.Year, d.DId)))); ctx.UpdateRange(deliveries.Where(d => dids.Contains((d.Year, d.DId))));
ctx.AddRange(deliveryParts.Where(p => dids.Contains((p.Year, p.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)) .Where(d => l.Contains(d.LsNr))
.Select(d => (d.Year, d.DId)) .Select(d => (d.Year, d.DId))
.ToList(); .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.RemoveRange(ctx.DeliveryParts.Where(p => l.Contains(p.Delivery.LsNr)));
ctx.UpdateRange(deliveries.Where(d => dids.Contains((d.Year, d.DId)))); ctx.UpdateRange(deliveries.Where(d => dids.Contains((d.Year, d.DId))));
ctx.AddRange(deliveryParts.Where(p => dids.Contains((p.Year, p.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)); importedDeliveries.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, deliveries.Count - n - o, meta.DeliveryFilters));
} }
try {
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
} catch (DbUpdateConcurrencyException) { } await AddImportedFiles(Path.GetFileName(meta.FileName));
await AddImportedFiles(filenames.Select(f => Path.GetFileName(f)));
} }
await App.HintContextChange(); await App.HintContextChange();
@ -258,8 +272,12 @@ namespace Elwig.Helpers.Export {
"Importieren erfolgreich", "Importieren erfolgreich",
MessageBoxButton.OK, MessageBoxImage.Information); MessageBoxButton.OK, MessageBoxImage.Information);
} catch (Exception exc) { } 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) { 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<DeliveryPart>, List<DeliveryPartModifier>) ToDelivery(this JsonNode json, Dictionary<int, int> currentDids) { public static (Delivery, List<DeliveryPart>, List<DeliveryPartModifier>) ToDelivery(this JsonNode json, Dictionary<string, int> currentLsNrs, Dictionary<int, int> currentDids) {
var year = json["year"]!.AsValue().GetValue<int>(); var year = json["year"]!.AsValue().GetValue<int>();
var did = ++currentDids[year]; var lsnr = json["lsnr"]!.AsValue().GetValue<string>();
var did = currentLsNrs.GetValueOrDefault(lsnr, -1);
if (did == -1) did = ++currentDids[year];
currentLsNrs[lsnr] = did;
return (new Delivery { return (new Delivery {
Year = year, Year = year,
DId = did, DId = did,
@ -559,7 +580,7 @@ namespace Elwig.Helpers.Export {
TimeString = json["time"]?.AsValue().GetValue<string>(), TimeString = json["time"]?.AsValue().GetValue<string>(),
ZwstId = json["zwstid"]!.AsValue().GetValue<string>(), ZwstId = json["zwstid"]!.AsValue().GetValue<string>(),
LNr = json["lnr"]!.AsValue().GetValue<int>(), LNr = json["lnr"]!.AsValue().GetValue<int>(),
LsNr = json["lsnr"]!.AsValue().GetValue<string>(), LsNr = lsnr,
MgNr = json["mgnr"]!.AsValue().GetValue<int>(), MgNr = json["mgnr"]!.AsValue().GetValue<int>(),
Comment = json["comment"]?.AsValue().GetValue<string>(), Comment = json["comment"]?.AsValue().GetValue<string>(),
}, json["parts"]!.AsArray().Select(p => p!.AsObject()).Select(p => new DeliveryPart { }, json["parts"]!.AsArray().Select(p => p!.AsObject()).Select(p => new DeliveryPart {