[#3] ElwigData: Fix importing of duplicate data
All checks were successful
Test / Run tests (push) Successful in 2m52s
All checks were successful
Test / Run tests (push) Successful in 2m52s
This commit is contained in:
@ -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 {
|
||||||
|
Reference in New Issue
Block a user