WineQualityStatistics: Add KMW mode
This commit is contained in:
@ -17,6 +17,7 @@ namespace Elwig.Documents {
|
||||
|
||||
public string Filter;
|
||||
public WineQualityStatisticsData Data;
|
||||
public bool UseOe => Data.UseOe;
|
||||
|
||||
public WineQualityStatistics(string filter, WineQualityStatisticsData data) : base($"{Name} {filter}") {
|
||||
Filter = filter;
|
||||
|
@ -26,15 +26,15 @@
|
||||
@foreach (var qualIds in Model.QualIds) {
|
||||
<td class="container">
|
||||
<div class="row">
|
||||
<span class="units">[°Oe]</span>
|
||||
<span class="units">[@(Model.UseOe ? "°Oe" : "°KMW")]</span>
|
||||
<span class="units">[#]</span>
|
||||
<span class="units">[kg]</span>
|
||||
</div>
|
||||
@foreach (var qualId in qualIds) {
|
||||
<h4>@(Model.QualityLevels.GetValueOrDefault(qualId, qualId))</h4>
|
||||
@foreach (var (oe, num, weight) in sec.Data.GetValueOrDefault(qualId, Array.Empty<(int, int, int)>())) {
|
||||
@foreach (var (grad, num, weight) in sec.Data.GetValueOrDefault(qualId, Array.Empty<(double, int, int)>())) {
|
||||
<div class="row">
|
||||
<span class="oe">@oe</span>
|
||||
<span class="gradation">@(Model.UseOe ? $"{grad:N0}" : $"{grad:N1}")</span>
|
||||
<span class="number">@($"{num:N0}")</span>
|
||||
<span class="number">@($"{weight:N0}")</span>
|
||||
</div>
|
||||
@ -45,13 +45,13 @@
|
||||
</tr>
|
||||
<tr>
|
||||
@foreach (var qualIds in Model.QualIds) {
|
||||
var quals = qualIds.Select(q => sec.Data.GetValueOrDefault(q, Array.Empty<(int Oe, int Num, int Weight)>()));
|
||||
var quals = qualIds.Select(q => sec.Data.GetValueOrDefault(q, Array.Empty<(double Grad, 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;
|
||||
var grad = quals.Sum(q => q.Sum(kv => kv.Grad * kv.Weight)) / weight;
|
||||
<td class="container bold">
|
||||
<div class="row">
|
||||
<span class="oe">@(weight == 0 ? "-" : $"{oe:N0}")</span>
|
||||
<span class="gradation">@(weight == 0 ? "-" : Model.UseOe ? $"{grad:N0}" : $"{grad:N1}")</span>
|
||||
<span class="number">@($"{num:N0}")</span>
|
||||
<span class="number">@($"{weight:N0}")</span>
|
||||
</div>
|
||||
@ -64,11 +64,11 @@
|
||||
@{
|
||||
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;
|
||||
var totalGrad = sec.Data.Values.Sum(q => q.Sum(kv => kv.Grad * kv.Weight)) / totalWeight;
|
||||
}
|
||||
<td colspan="4" class="container bold footer @(sec.Type == "R" ? "red" : sec.Type == "W" ? "green" : "")">
|
||||
<div class="row" style="width: 24%; margin-left: 76%;">
|
||||
<span class="oe">@(totalWeight == 0 ? "-" : $"{totalOe:N0}")</span>
|
||||
<span class="gradation">@(totalWeight == 0 ? "-" : Model.UseOe ? $"{totalGrad:N0}" : $"{totalGrad:N1}")</span>
|
||||
<span class="number">@($"{totalNum:N0}")</span>
|
||||
<span class="number">@($"{totalWeight:N0}")</span>
|
||||
</div>
|
||||
|
@ -85,7 +85,7 @@ table .footer.green {
|
||||
padding: 1mm;
|
||||
}
|
||||
|
||||
.oe {
|
||||
.gradation {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
@ -5,14 +5,14 @@ using System.Collections.Generic;
|
||||
using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
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 Num, int Weight);
|
||||
public record struct QualitySection(string Name, string? Type, Dictionary<string, (int Oe, int Num, int Weight)[]> Data);
|
||||
public record struct QualityRow(string? Variety, string? Attribute, string? Cultivation, string? Type, string QualId, double Grad, int Num, int Weight);
|
||||
public record struct QualitySection(string Name, string? Type, Dictionary<string, (double Grad, int Num, int Weight)[]> Data);
|
||||
|
||||
public bool UseOe = true;
|
||||
public QualitySection[] Sections;
|
||||
|
||||
public WineQualityStatisticsData(QualitySection[] sections) {
|
||||
@ -21,8 +21,8 @@ namespace Elwig.Models.Dtos {
|
||||
|
||||
private static QualitySection[] GetQualitySections(IEnumerable<QualityRow> rows) {
|
||||
var data = new List<QualitySection>();
|
||||
var currentQual = new Dictionary<int, (int Num, int Weight)>();
|
||||
var current = new Dictionary<string, (int, int, int)[]>();
|
||||
var currentQual = new Dictionary<double, (int Num, int Weight)>();
|
||||
var current = new Dictionary<string, (double, int, int)[]>();
|
||||
string? lastSection = null;
|
||||
string? lastType = null;
|
||||
string? lastQual = null;
|
||||
@ -43,7 +43,7 @@ namespace Elwig.Models.Dtos {
|
||||
current = [];
|
||||
currentQual.Clear();
|
||||
}
|
||||
currentQual[row.Oe] = (row.Num, row.Weight);
|
||||
currentQual[row.Grad] = (row.Num, row.Weight);
|
||||
lastSection = sec;
|
||||
lastType = row.Type;
|
||||
lastQual = row.QualId;
|
||||
@ -60,7 +60,7 @@ namespace Elwig.Models.Dtos {
|
||||
return [.. data];
|
||||
}
|
||||
|
||||
public static async Task<WineQualityStatisticsData> FromQuery(IQueryable<DeliveryPart> query) {
|
||||
public static async Task<WineQualityStatisticsData> FromQuery(IQueryable<DeliveryPart> query, bool useOe = true) {
|
||||
var rows = (await query
|
||||
.GroupBy(p => new {
|
||||
p.Variety.Type,
|
||||
@ -68,7 +68,7 @@ namespace Elwig.Models.Dtos {
|
||||
Attribute = p.Attribute!.Name,
|
||||
Cultivation = p.Cultivation!.Name,
|
||||
p.QualId,
|
||||
Oe = (int)Math.Round(p.Kmw * (4.54 + 0.022 * p.Kmw), 0),
|
||||
Oe = useOe ? Math.Round(p.Kmw * (4.54 + 0.022 * p.Kmw), 0) : Math.Round(p.Kmw, 1),
|
||||
}, (k, g) => new { Key = k, Num = g.Count(), Weight = g.Sum(p => p.Weight) })
|
||||
.OrderBy(g => g.Key.Variety)
|
||||
.ThenBy(g => g.Key.Attribute)
|
||||
@ -84,22 +84,22 @@ 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(g => g.Num), g.Sum(p => p.Weight)))
|
||||
.GroupBy(s => new { s.Type, s.QualId, s.Grad }, (k, g) => new QualityRow(null, null, null, k.Type, k.QualId, k.Grad, g.Sum(g => g.Num), g.Sum(p => p.Weight)))
|
||||
.OrderBy(g => g.Type)
|
||||
.ThenBy(g => g.QualId)
|
||||
.ThenBy(g => g.Oe)
|
||||
.ThenBy(g => g.Grad)
|
||||
.ToList();
|
||||
var typeData = GetQualitySections(typeRows);
|
||||
if (typeData.Length <= 1)
|
||||
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.Num), g.Sum(p => p.Weight)))
|
||||
.GroupBy(s => new { s.QualId, s.Grad }, (k, g) => new QualityRow(null, null, null, null, k.QualId, k.Grad, g.Sum(p => p.Num), g.Sum(p => p.Weight)))
|
||||
.OrderBy(g => g.QualId)
|
||||
.ThenBy(g => g.Oe)
|
||||
.ThenBy(g => g.Grad)
|
||||
.ToList();
|
||||
var totalData = GetQualitySections(totalRows);
|
||||
return new([.. totalData, .. typeData, .. data]);
|
||||
return new([.. totalData, .. typeData, .. data]) { UseOe = useOe };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user