@page "/cocktails/{CocktailId}" @using CocktailWeb.Data @using Microsoft.AspNetCore.Components.Sections @using Microsoft.EntityFrameworkCore @inject IDbContextFactory DataContextFactory; Zurück @if (SelectedCocktail == null) {

Cocktail konnte nicht gefunden werden

} else {
Einstellungen

Stärke
@if (!UseNewIntensityCalc) {
} else {
}

@if (ErrorMessage != null) { } @if (CocktailCode != null) { }
...
@SelectedCocktail.Name

Rezept:
@{ int i = 1; } @foreach (var Zutat in SelectedCocktail.Cocktailflaschen.OrderBy(f => f.Reihenfolge)) { @if (DrinkIntensity != 0) { } i++; } @if (DrinkIntensity != 0) { }
@i. @Zutat.Flasche?.Name @Zutat.Menge ml=> @ModifiedCocktail?.Cocktailflaschen.First(cf => cf.FlascheID == Zutat.FlascheID).Menge ml@(ZutatInMaschine(Zutat) ? "" : "fehlt")
Gesamt @SelectedCocktail.Cocktailflaschen.Sum(cf => cf.Menge) ml=> @ModifiedCocktail?.Cocktailflaschen.Sum(cf => cf.Menge) ml

} @code { [Parameter] public string? CocktailId { get; set; } private DbDataContext? _DataContext; private Cocktail? SelectedCocktail; private Cocktail? ModifiedCocktail; private List? MaschinenFiller; //private List ModifiedCocktailRecipe = new(); private int DrinkIntensity = 0; private bool UseNewIntensityCalc = false; private string? ErrorMessage; private string? CocktailCode; protected override async Task OnInitializedAsync() { int id = Convert.ToInt32(CocktailId); //Staerke_Off.Add(); _DataContext ??= await DataContextFactory.CreateDbContextAsync(); if (_DataContext != null) { SelectedCocktail = _DataContext.Cocktails.Include(c => c.Cocktailflaschen).ThenInclude(cf => cf.Flasche).Single(c => c.Id == id); ModifiedCocktail = _DataContext.Cocktails.Include(c => c.Cocktailflaschen).ThenInclude(cf => cf.Flasche).AsNoTracking().Single(c => c.Id == id); MaschinenFiller = _DataContext.Fillers.Include(f => f.Flasche).OrderBy(f => f.Pos).ToList(); } // if (SelectedCocktail != null) // { // foreach (CocktailFlasche cf in SelectedCocktail.Cocktailflaschen) // { // ModifiedCocktailRecipe.Add(new CocktailFlasche() { // Flasche = cf.Flasche, // Menge = cf.Menge // }); // } // } } private bool ZutatInMaschine(CocktailFlasche zutat) { return (MaschinenFiller != null && MaschinenFiller.Exists(f => f.Flasche == zutat.Flasche)); } /// /// Prüft, ob der Cocktail gesendet werden kann /// /// private bool IsValid() { ErrorMessage = null; if (ModifiedCocktail == null || MaschinenFiller == null) { ErrorMessage = "Cocktail nicht gefunden."; return false; } if (ModifiedCocktail.Cocktailflaschen.Count == 0) { ErrorMessage = "Der Cocktail enthält keine Zutaten"; return false; } if (!ModifiedCocktail.Cocktailflaschen.All(cf => MaschinenFiller.Any(mf => mf.Flasche?.Id == cf.FlascheID))) { ErrorMessage = "Es sind nicht alle Zutaten in der Cocktailmaschine geladen!"; return false; } return true; } /// /// Erstellt den für die Arduino-Steuerung erforderlichen Code /// private void CreateCocktailCode() { CocktailCode = null; if (!IsValid() || ModifiedCocktail == null || MaschinenFiller == null) return; List lines = new(); lines.Add("START"); @foreach (CocktailFlasche Zutat in ModifiedCocktail.Cocktailflaschen.OrderBy(f => f.Reihenfolge)) { string line = ""; Filler Filler = MaschinenFiller.First(mf => mf.Flasche?.Id == Zutat.FlascheID); if (Filler.Type == Filler.FillerType.Pump) { line = $"P{Filler.Pos}={Zutat.Menge}"; } else if (Filler.Type == Filler.FillerType.Pourer) { line = $"F{Filler.Pos}={Zutat.Menge}"; } lines.Add(line); } lines.Add("ZIEL"); CocktailCode = String.Join("\r\n", lines.ToArray()); } /// /// Setzt die Alkoholintensität und berechnet die Mengen für ModifiedCocktail entsprechend neu /// /// Zugabe/Abzug von Alkohol in Prozent private void SetIntensity(int intensity) { DrinkIntensity = intensity; if (ModifiedCocktail == null || SelectedCocktail == null) return; foreach (CocktailFlasche cf in ModifiedCocktail.Cocktailflaschen) { int OriginalMenge = SelectedCocktail.Cocktailflaschen.First(scf => scf.Id == cf.Id).Menge; if (cf.Flasche.Alkoholisch) { cf.Menge = OriginalMenge + (OriginalMenge * intensity / 100); } else { cf.Menge = OriginalMenge - (OriginalMenge * intensity / 100); } } // Durch das anteilige Umrechnen ändert sich die Gesamtmenge, daher passen wir die Mengen nochmal an int AktGesMenge = ModifiedCocktail.Cocktailflaschen.Sum(cf => cf.Menge); int OrigMenge = SelectedCocktail.Cocktailflaschen.Sum(cf => cf.Menge); foreach (CocktailFlasche cf in ModifiedCocktail.Cocktailflaschen) { cf.Menge = (int)((float)cf.Menge / AktGesMenge * OrigMenge); } } // ToDo: Ggf. noch Rundungsfehler drin oder wirklich noch grobe Fehler in der Mathematik.. Gesamtmenge passt irgendwie nicht. /// /// Ändert die Alkoholintensität basierend auf den Prozentwerten anstatt der Menge /// /// Intensitätslevel (z.B. -1, 0, 1,2 ...) private void SetIntensityPercentual(int intensitylevel) { DrinkIntensity = intensitylevel; if (ModifiedCocktail == null || SelectedCocktail == null) return; int DivideParts = 4; // Gibt an, in wieviele Teile die nicht-alkoholische Gesamtmenge aufgeteilt wird. Sollte mindestens 1 oder 2 mehr als das Max.Intensitätslevel sein float IncreasePerLevel_pct; // Gibt an, um welchen Anteil in % die alkoholischen Getränke steigen. float SumAlcoholic_ml = SelectedCocktail.Cocktailflaschen.Where(cf => cf.Flasche.Alkoholisch).Sum(cf => cf.Menge); // Summe in ml der Alkoholhaltigen Zutaten float SumNonAlcoholic_ml = SelectedCocktail.Cocktailflaschen.Where(cf => !cf.Flasche.Alkoholisch).Sum(cf => cf.Menge); // Summe in ml der Alkoholfreien Zutaten float SumTotal = SumAlcoholic_ml + SumNonAlcoholic_ml; float SumAlcoholic_pct = SumAlcoholic_ml / SumTotal * 100; //Prozentwert an alkoholhaltigen Zutaten float SumNonAlcoholic_pct = SumNonAlcoholic_ml / SumTotal * 100; //Prozentwert an alkoholhaltigen Zutaten float SumBasis_ml = intensitylevel >= 0 ? SumNonAlcoholic_ml : SumAlcoholic_ml; // Wenn Intensität > 0, dann ist Summenbasis nichtalkoholisch, ansonsten alkoholisch if (intensitylevel >= 0) { /// Wenn alkoholhaltiges 30% ausmacht, teilen wir den Rest (alkoholfreis, 70%) durch die o.g. DivideParts, damit wir wissen um wieviel Prozent pro Stufe wir erhöhen können IncreasePerLevel_pct = SumNonAlcoholic_pct / DivideParts; } else { // Cocktail abschwächen, daher teilen wir in die andere Richtung auf IncreasePerLevel_pct = SumAlcoholic_pct / DivideParts; } foreach (CocktailFlasche cf in ModifiedCocktail.Cocktailflaschen) { float OrigMenge = SelectedCocktail.Cocktailflaschen.First(f => f.Id == cf.Id).Menge; // Herausfinden, wieviel Prozent die Zutat in ihrem Bereich (Alkoholisch/Nichtalkoholisch) ausmacht float ZutatIncrease_pct = IncreasePerLevel_pct / SumBasis_ml * cf.Menge; float ZutatMenge_pct = (float)OrigMenge / SumTotal * 100; // Neue Menge in Prozent: ZutatMenge_pct + ZutatIncrease_pct if (!cf.Flasche.Alkoholisch ^ intensitylevel < 0 ) { ZutatIncrease_pct *= -1; } cf.Menge = (int)Math.Round(OrigMenge / ZutatMenge_pct * (ZutatMenge_pct + (ZutatIncrease_pct * intensitylevel)), 0, MidpointRounding.AwayFromZero); } } }