From 82ea5920f2d97dd16324d26d5951cd3c10e34ddc Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 28 Mar 2024 13:18:32 +0100 Subject: [PATCH] [#30] WineQualityStatistics: Add number of deliveries --- Elwig/Documents/WineQualityStatistics.cshtml | 24 ++++++++++++------- Elwig/Documents/WineQualityStatistics.css | 5 +++- .../Models/Dtos/WineQualityStatisticsData.cs | 24 +++++++++---------- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/Elwig/Documents/WineQualityStatistics.cshtml b/Elwig/Documents/WineQualityStatistics.cshtml index 9ec508d..5cb1fb2 100644 --- a/Elwig/Documents/WineQualityStatistics.cshtml +++ b/Elwig/Documents/WineQualityStatistics.cshtml @@ -27,14 +27,16 @@
[°Oe] + [#] [kg]
@foreach (var qualId in qualIds) {

@(Model.QualityLevels.GetValueOrDefault(qualId, qualId))

- @foreach (var (oe, weight) in sec.Data.GetValueOrDefault(qualId, Array.Empty<(int, int)>())) { + @foreach (var (oe, num, weight) in sec.Data.GetValueOrDefault(qualId, Array.Empty<(int, int, int)>())) {
@oe - @($"{weight:N0}") + @($"{num:N0}") + @($"{weight:N0}")
} } @@ -43,13 +45,15 @@ @foreach (var qualIds in Model.QualIds) { - var quals = qualIds.Select(q => sec.Data.GetValueOrDefault(q, Array.Empty<(int, int)>())); - var weight = quals.Sum(q => q.Sum(kv => kv.Item2)); - var oe = quals.Sum(q => q.Sum(kv => (double)kv.Item1 * kv.Item2)) / weight; + var quals = qualIds.Select(q => sec.Data.GetValueOrDefault(q, Array.Empty<(int Oe, int Num, int Weight)>())); + var weight = quals.Sum(q => q.Sum(kv => kv.Weight)); + var num = quals.Sum(q => q.Sum(kv => kv.Num)); + var oe = quals.Sum(q => q.Sum(kv => (double)kv.Oe * kv.Weight)) / weight;
- @(weight == 0 ? "" : $"{oe:N0}") - @($"{weight:N0}") + @(weight == 0 ? "-" : $"{oe:N0}") + @($"{num:N0}") + @($"{weight:N0}")
} @@ -59,12 +63,14 @@ @{ var totalWeight = sec.Data.Values.Sum(q => q.Sum(kv => kv.Weight)); + var totalNum = sec.Data.Values.Sum(q => q.Sum(kv => kv.Num)); var totalOe = sec.Data.Values.Sum(q => q.Sum(kv => (double)kv.Oe * kv.Weight)) / totalWeight; }
- @(totalWeight == 0 ? "" : $"{totalOe:N0}") - @($"{totalWeight:N0}") + @(totalWeight == 0 ? "-" : $"{totalOe:N0}") + @($"{totalNum:N0}") + @($"{totalWeight:N0}")
diff --git a/Elwig/Documents/WineQualityStatistics.css b/Elwig/Documents/WineQualityStatistics.css index 1fe5451..972691f 100644 --- a/Elwig/Documents/WineQualityStatistics.css +++ b/Elwig/Documents/WineQualityStatistics.css @@ -88,6 +88,9 @@ table .footer.green { text-align: center; } -.weight { +.number { text-align: right; } + +.row span:first-child { flex-basis: 7.5mm; } +.row span:last-child { flex-basis: 15mm; } diff --git a/Elwig/Models/Dtos/WineQualityStatisticsData.cs b/Elwig/Models/Dtos/WineQualityStatisticsData.cs index b76b19b..c4a503e 100644 --- a/Elwig/Models/Dtos/WineQualityStatisticsData.cs +++ b/Elwig/Models/Dtos/WineQualityStatisticsData.cs @@ -10,8 +10,8 @@ using System.Windows; namespace Elwig.Models.Dtos { public class WineQualityStatisticsData { - public record struct QualityRow(string? Variety, string? Attribute, string? Cultivation, string? Type, string QualId, int Oe, int Weight); - public record struct QualitySection(string Name, string? Type, Dictionary Data); + public record struct QualityRow(string? Variety, string? Attribute, string? Cultivation, string? Type, string QualId, int Oe, int Num, int Weight); + public record struct QualitySection(string Name, string? Type, Dictionary Data); public QualitySection[] Sections; @@ -21,8 +21,8 @@ namespace Elwig.Models.Dtos { private static QualitySection[] GetQualitySections(IEnumerable rows) { var data = new List(); - var currentQual = new Dictionary(); - var current = new Dictionary(); + var currentQual = new Dictionary(); + var current = new Dictionary(); string? lastSection = null; string? lastType = null; string? lastQual = null; @@ -31,25 +31,25 @@ namespace Elwig.Models.Dtos { $"{(row.Attribute != null ? " / " : "")}{row.Attribute}" + $"{(row.Cultivation != null ? " / " : "")}{row.Cultivation}"; if (lastQual != null && lastQual != row.QualId) { - current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value)).ToArray(); + current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value.Num, kv.Value.Weight)).ToArray(); currentQual.Clear(); } if (lastSection != null && lastSection != sec) { if (!current.ContainsKey(lastQual!)) { - current[lastQual!] = currentQual.Select(kv => (kv.Key, kv.Value)).ToArray(); + current[lastQual!] = currentQual.Select(kv => (kv.Key, kv.Value.Num, kv.Value.Weight)).ToArray(); currentQual.Clear(); } data.Add(new(lastSection, lastType, current)); current = []; currentQual.Clear(); } - currentQual[row.Oe] = row.Weight; + currentQual[row.Oe] = (row.Num, row.Weight); lastSection = sec; lastType = row.Type; lastQual = row.QualId; } if (lastQual != null) { - current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value)).ToArray(); + current[lastQual] = currentQual.Select(kv => (kv.Key, kv.Value.Num, kv.Value.Weight)).ToArray(); currentQual.Clear(); } if (lastSection != null) { @@ -69,14 +69,14 @@ namespace Elwig.Models.Dtos { Cultivation = p.Cultivation!.Name, p.QualId, Oe = (int)Math.Round(p.Kmw * (4.54 + 0.022 * p.Kmw), 0), - }, (k, g) => new { Key = k, Weight = g.Sum(p => p.Weight) }) + }, (k, g) => new { Key = k, Num = g.Count(), Weight = g.Sum(p => p.Weight) }) .OrderBy(g => g.Key.Variety) .ThenBy(g => g.Key.Attribute) .ThenBy(g => g.Key.Cultivation) .ThenBy(g => g.Key.QualId) .ThenBy(g => g.Key.Oe) .ToListAsync()) - .Select(r => new QualityRow(r.Key.Variety, r.Key.Attribute, r.Key.Cultivation, r.Key.Type, r.Key.QualId, r.Key.Oe, r.Weight)) + .Select(r => new QualityRow(r.Key.Variety, r.Key.Attribute, r.Key.Cultivation, r.Key.Type, r.Key.QualId, r.Key.Oe, r.Num, r.Weight)) .ToList(); var data = GetQualitySections(rows); @@ -84,7 +84,7 @@ namespace Elwig.Models.Dtos { return new(data); var typeRows = rows - .GroupBy(s => new { s.Type, s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, k.Type, k.QualId, k.Oe, g.Sum(p => p.Weight))) + .GroupBy(s => new { s.Type, s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, k.Type, k.QualId, k.Oe, g.Sum(g => g.Num), g.Sum(p => p.Weight))) .OrderBy(g => g.Type) .ThenBy(g => g.QualId) .ThenBy(g => g.Oe) @@ -94,7 +94,7 @@ namespace Elwig.Models.Dtos { return new([.. typeData, .. data]); var totalRows = rows - .GroupBy(s => new { s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, null, k.QualId, k.Oe, g.Sum(p => p.Weight))) + .GroupBy(s => new { s.QualId, s.Oe }, (k, g) => new QualityRow(null, null, null, null, k.QualId, k.Oe, g.Sum(p => p.Num), g.Sum(p => p.Weight))) .OrderBy(g => g.QualId) .ThenBy(g => g.Oe) .ToList();