Add status bar in DeliveryAdminWindow

This commit is contained in:
2023-08-20 00:05:20 +02:00
parent f735da0059
commit 8534ff6bba
4 changed files with 154 additions and 26 deletions

View File

@ -165,18 +165,21 @@ namespace Elwig.Windows {
deliveryQuery = deliveryQuery.Where(d => d.Year == SeasonInput.Value);
}
var filterVar = new List<string>();
var filterQual = new List<string>();
var filterMgNr = new List<int>();
var filterDate = new List<string>();
var filterPartDate = new List<string>();
double filterKmwGt = 0;
double filterKmwLt = 0;
double filterOeGt = 0;
double filterOeLt = 0;
var filter = TextFilter.ToList();
if (filter.Count > 0) {
var var = await Context.WineVarieties.Select(v => v.SortId).ToListAsync();
var qual = await Context.WineQualityLevels.Select(q => q.QualId).ToListAsync();
var mgnr = await Context.Members.Select(m => m.MgNr.ToString()).ToListAsync();
var filterVar = new List<string>();
var filterQual = new List<string>();
var filterMgNr = new List<int>();
double filterKmwGt = 0;
double filterKmwLt = 0;
double filterOeGt = 0;
double filterOeLt = 0;
for (int i = 0; i < filter.Count; i++) {
var e = filter[i];
@ -190,22 +193,31 @@ namespace Elwig.Windows {
filterMgNr.Add(int.Parse(e));
filter.RemoveAt(i--);
} else if (e.StartsWith(">") || e.StartsWith("<")) {
if (double.TryParse(e[1..], out var res)) {
switch ((e[0], res)) {
case ('>', <= 30): filterKmwGt = res; break;
case ('<', <= 30): filterKmwLt = res; break;
case ('>', _): filterOeGt = res; break;
case ('<', _): filterOeLt = res; break;
if (double.TryParse(e[1..], out var num)) {
switch ((e[0], num)) {
case ('>', <= 30): filterKmwGt = num; break;
case ('<', <= 30): filterKmwLt = num; break;
case ('>', _): filterOeGt = num; break;
case ('<', _): filterOeLt = num; break;
}
filter.RemoveAt(i--);
}
if (e.Length == 1) filter.RemoveAt(i--);
} else if (DateOnly.TryParse(e, out var date)) {
filterDate.Add($"{date:yyyy-MM-dd}");
filter.RemoveAt(i--);
} else if (Utils.PartialDateRegex.IsMatch(e)) {
var parts = e.Split(".");
filterPartDate.Add($"-{int.Parse(parts[1]):00}-{int.Parse(parts[0]):00}");
filter.RemoveAt(i--);
} else if (e.Length > 2 && e.StartsWith("\"") && e.EndsWith("\"")) {
filter[i] = e[1..^1];
}
}
if (filterMgNr.Count > 0) deliveryQuery = deliveryQuery.Where(d => filterMgNr.Contains(d.MgNr));
if (filterDate.Count > 0) deliveryQuery = deliveryQuery.Where(d => filterDate.Contains(d.DateString));
if (filterPartDate.Count > 0) deliveryQuery = deliveryQuery.Where(d => filterPartDate.Contains(d.DateString.Substring(4)));
if (filterVar.Count > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => filterVar.Contains(p.SortId)));
if (filterQual.Count > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => filterQual.Contains(p.QualId)));
if (filterKmwGt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw >= filterKmwGt));
@ -228,6 +240,74 @@ namespace Elwig.Windows {
}
ControlUtils.RenewItemsSource(DeliveryList, deliveries, d => ((d as Delivery)?.Year, (d as Delivery)?.DId), DeliveryList_SelectionChanged, ControlUtils.RenewSourceDefault.IfOnly, !updateSort);
var members = deliveries.Select(d => d.Member).DistinctBy(m => m.MgNr).ToList();
StatusMembers.Text = $"Mitglieder: {members.Count}" + (members.Count > 0 && members.Count <= 4 ? $" ({string.Join(", ", members.Select(m => m.AdministrativeName))})" : "");
StatusDeliveries.Text = $"Lieferungen: {deliveries.Count}";
if (filter.Count == 0) {
var partsQuery = deliveryQuery.SelectMany(d => d.Parts);
if (filterVar.Count > 0) partsQuery = partsQuery.Where(p => filterVar.Contains(p.SortId));
if (filterQual.Count > 0) partsQuery = partsQuery.Where(p => filterQual.Contains(p.QualId));
if (filterKmwGt > 0) partsQuery = partsQuery.Where(p => p.Kmw >= filterKmwGt);
if (filterKmwLt > 0) partsQuery = partsQuery.Where(p => p.Kmw < filterKmwLt);
if (filterOeGt > 0) partsQuery = partsQuery.Where(p => p.Kmw * (4.54 + 0.022 * p.Kmw) >= filterOeGt);
if (filterOeLt > 0) partsQuery = partsQuery.Where(p => p.Kmw * (4.54 + 0.022 * p.Kmw) < filterOeLt);
var deliveryParts = partsQuery;
var n = await deliveryParts.CountAsync();
StatusDeliveries.Text = $"Lieferungen: {deliveries.Count} ({n})";
var varieties = await deliveryParts.Select(d => d.SortId).Distinct().ToListAsync();
StatusVarieties.Text = $"Sorten: {varieties.Count}" + (varieties.Count > 0 && varieties.Count <= 10 ? $" ({string.Join(", ", varieties)})" : "");
var weight = await deliveryParts.SumAsync(p => p.Weight);
StatusWeight.Text = $"Gewicht: {weight:N0} kg";
if (n > 0) {
var kmwMin = await deliveryParts.MinAsync(p => p.Kmw);
var kmwAvg = Utils.AggregateDeliveryPartsKmw(deliveryParts);
var kmwMax = await deliveryParts.MaxAsync(p => p.Kmw);
StatusGradation.Text = $"Gradation: {kmwMin:N1}° / {kmwAvg:N1}° / {kmwMax:N1}°";
} else {
StatusGradation.Text = "Gradation: -";
}
if (n > 0 && n <= 200) {
var parts = (await deliveryParts.ToListAsync());
var groups = parts
.GroupBy(p => string.Join("/", p.Attributes.Select(a => a.Name)))
.Select(g => (g.Key, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw)))
.OrderByDescending(g => g.Item2)
.ToList();
if (groups.Count == 1) {
var g = groups.First().Key;
if (g != "") {
StatusWeight.Text += $" ({g})";
StatusGradation.Text += $" ({g})";
}
var sortGroups = parts
.GroupBy(p => p.SortId)
.Select(g => (g.Key, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw)))
.OrderByDescending(g => g.Item2)
.ToList();
if (sortGroups.Count > 1 && sortGroups.Count <= 4) {
StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item2:N0} kg" + (g.Key == "" ? "" : $" ({g.Key})")))}";
StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" ({g.Key})")))}";
}
} else if (groups.Count <= 4) {
StatusWeight.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item2:N0} kg" + (g.Key == "" ? "" : $" ({g.Key})")))}";
StatusGradation.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" ({g.Key})")))}";
}
}
} else {
StatusVarieties.Text = "Sorten: -";
StatusWeight.Text = "Gewicht: -";
StatusGradation.Text = "Gradation: -";
}
}
protected override async Task RenewContext() {