using DatenDB; using Deckungsbeitrag.AA_Klassen; using HarfBuzzSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Font = System.Drawing.Font; namespace Deckungsbeitrag.AA_Forms { public partial class FormWSVerfolgung : Form { private readonly SPSDaten _monitor; //Ziel der Eventanfragen für die SPS. private string Userid; private Maschine maschine; private Auftrag auftrag; private Meldungen meldung = new Meldungen(); private Aufgabe aufgabe; private WSFach fach; private Auftrag extraAuftrag; private List auftragsliste; public bool ws1transport = false; public bool ws2transport = false; public FormWSVerfolgung() { InitializeComponent(); this.BackColor = Color.Black; this.WindowState = FormWindowState.Maximized; this.FormBorderStyle = FormBorderStyle.None; } public FormWSVerfolgung(string userid) : this() { this.Userid = userid; if (userid.Contains("01")) this.maschine = Maschine.GetMaschine(null, "Waschstrasse 1"); if (userid.Contains("02")) this.maschine = Maschine.GetMaschine(null, "Waschstrasse 2"); this._monitor = new SPSDaten(); //Je nach Maschine werden die richtigen Events erstellt. if (maschine.MaschineID == 1) { _monitor.WS1Transport += Transport_ValueChanged; //_monitor.Presse1Leer += WS1_Value_Changed; //_monitor.Trockner1Beladen += WS1_Value_Changed; //_monitor.Trockner1Entladen += WS1_Value_Changed; //_monitor.TischSummaryWS1_print += TischSummary_print; //_monitor.BegleitzettelWS1_print += Begleitzettel_print; } //Maschine 1 else { _monitor.WS2Transport += Transport_ValueChanged; //_monitor.Presse2Leer += WS2_Value_Changed; //_monitor.Trockner2Beladen += WS2_Value_Changed; //_monitor.Trockner2Entladen += WS2_Value_Changed; //_monitor.TischSummaryWS2_print += TischSummary_print; //_monitor.BegleitzettelWS2_print += Begleitzettel_print; } //Maschine 2 } private void WSVerfolgung_Load(object sender, EventArgs e) { // WaitCursor this.Cursor = Cursors.WaitCursor; // StatusStrip DropDown laden. this.toolStripDropDownButtonInfo.DropDownItems.Clear(); List aufgabenliste = Aufgabe.GetList((int)Kategorie.Waschstrasse); foreach(Aufgabe auf in aufgabenliste) { ToolStripMenuItem item = new ToolStripMenuItem(auf.Bezeichnung); item.Tag = auf; item.Click += AufgabeAuswaehlen_Click; toolStripDropDownButtonInfo.DropDownItems.Add(item); } } /// /// Controls werden hier bevor sie angezeigt werden berechnet. Danach werden sie Eingeblendet und der Cursor auf Default gestellt. /// /// /// private void FormWSVerfolgung_Shown(object sender, EventArgs e) { // Während dem Laden wird das Layout unterdrückt und der Screen ausgeblendet. this.SuspendLayout(); this.Visible = false; // Größer des TabelPanels anpassen. this.tableLayoutPanelWSVerfolgung.Height = this.statusStripWSVerfolgung.Top; // Wenn bei Maschine TrocknerKaputt wird Anzahl Fächer um 1 reduziert. if (maschine.TrocknerKaputt) this.tableLayoutPanelWSVerfolgung.RowCount = maschine.Faecher - 1; else this.tableLayoutPanelWSVerfolgung.RowCount = maschine.Faecher; // Bei TabelPanel werden die Styles gelöscht und neu ertellt. Gleichmäßige Aufteilung in Prozent. this.tableLayoutPanelWSVerfolgung.RowStyles.Clear(); for (int i = 0; i < tableLayoutPanelWSVerfolgung.RowCount; i++) { tableLayoutPanelWSVerfolgung.RowStyles.Add(new RowStyle(SizeType.Percent, 100f / tableLayoutPanelWSVerfolgung.RowCount)); } // TabelPanel laden. Panel_Laden(true); // Layout unterdrücken und Screen einblenden. Cursor wird auf Default gesetzt. this.Visible = true; this.ResumeLayout(true); this.Cursor = Cursors.Default; } /// /// ScreenControls in Panel von Fachliste laden. /// /// Wenn Neustart dann true sonst false. private void Panel_Laden(bool neustart) { // Fachliste holen damit letzter Auftrag vom Vortag übernommen werden kann. List fachliste = WSFach.GetFachliste(maschine); // Wenn erster Start dann Auftrag aus letztem Fach holen? if (neustart) { this.fach = new WSFach(); if (meldung.MaschinenStart() == DialogResult.Yes) { // Wenn holen, dann Auftrag und aufgabe aus fachliste holen. this.auftrag = Auftrag.GetAuftrag(fachliste[0].AuftragID); this.aufgabe = Aufgabe.GetAufgabe(null, fachliste[0].AufgabeID); } else { // Wenn nicht holen, dann Auftrag und Aufgabe enfernen. this.auftrag = null; this.aufgabe = null; // Neuen Auftrag eingeben. Wenn kein ExtraKunde wird false als extra weitergegeben. //Open_NeuerAuftrag(false); //TODO: Auftragauswahl aufrufen statt NeuerAuftrag. (Wenn Fahrer Aufträge erstellen) Open_Liste(false); // Fachliste neu laden damit neuer Auftrag in erstes Fach geladen werden kann. fachliste = WSFach.GetFachliste(maschine); } } // Alle Controls aus dem Panel entfernen. this.tableLayoutPanelWSVerfolgung.Controls.Clear(); // UserControls mit Daten aus Fachliste in Panel laden. if (fachliste.Count > 0) { for (int row = 0; row < fachliste.Count; row++) { Auftrag auftrag = Auftrag.GetAuftrag(fachliste[row].AuftragID); Aufgabe aufgabe = Aufgabe.GetAufgabe(null, fachliste[row].AufgabeID); UCFach ucfach = new UCFach(); ucfach.Dock = DockStyle.Fill; // Fach Name und Farbe if (this.maschine.Bezeichnung == "Waschstrasse 1") { switch (row + 1) { case int n when (n <= 4): ucfach.ForeColor = Config.FarbenConfig.Farben["Beladeband"]; ucfach.FachName = $"F"; break; case int n when (n >= 5 && n <= 13): ucfach.ForeColor = Config.FarbenConfig.Farben["Waschstrasse"]; ucfach.FachName = $"W"; break; case int n when (n == 14): ucfach.ForeColor = Config.FarbenConfig.Farben["Presse"]; ucfach.FachName = $"P"; break; case int n when (n == 15): ucfach.ForeColor = Config.FarbenConfig.Farben["Hubband"]; ucfach.FachName = $"H"; break; case int n when (n == 16): ucfach.ForeColor = Config.FarbenConfig.Farben["Trockner"]; ucfach.FachName = $"T"; break; case int n when (n == 17): if (maschine.TrocknerKaputt) { ucfach.ForeColor = Config.FarbenConfig.Farben["Entladeband"]; ucfach.FachName = $"E"; } else { ucfach.ForeColor = Config.FarbenConfig.Farben["Trockner"]; ucfach.FachName = $"T"; } break; case int n when (n == 18): ucfach.ForeColor = Config.FarbenConfig.Farben["Entladeband"]; ucfach.FachName = $"E"; break; default: break; } } // Wenn Kunde hat keinen Suchtext, dann Kundename anzeigen. if(string.IsNullOrWhiteSpace(Kunde.GetKunde(null, auftrag.KundeID, null).Suchtext))ucfach.KundeName = Kunde.GetKunde(null, auftrag.KundeID, null).KundeName; else ucfach.KundeName = Kunde.GetKunde(null, auftrag.KundeID, null).Suchtext; CultureInfo deCult = new CultureInfo("de-DE"); ucfach.LieferTag = ((Liefertag)auftrag.Liefertag.DayOfWeek).ToString(); // Wenn Fachliste Item hat Aufgabe. if (aufgabe != null) { // Wenn Aufgabe ist ein Extra Kunde. if (aufgabe.Bezeichnung == "Extra Kunde") ucfach.Aufgabe = "Extra Kunde " + Kunde.GetKunde(null, Auftrag.GetAuftrag(fachliste[row].ExtraAuftragID).KundeID, null).Suchtext; else ucfach.Aufgabe = aufgabe.Bezeichnung; // Hintergrund des Fachs in der Farbe der Aufgabe. ACHTUNG WEGEN KONTRAST ZU SCHRIFTFARBE. ucfach.BackColor = aufgabe.Farbe; } else ucfach.Aufgabe = null; this.tableLayoutPanelWSVerfolgung.Controls.Add(ucfach, 0, row); } } } /// /// Wenn eine Info von der Statusleiste gewählt wurde. /// /// /// private void AufgabeAuswaehlen_Click(object sender, EventArgs e) { ToolStripMenuItem item = (ToolStripMenuItem)sender; // Aufgabe wird aus dem StatusStripItem geholt. this.aufgabe = (Aufgabe)item.Tag; // Wenn Aufgabe ist ExtraKunde wird NeuerAuftrag geöffnet. if (((Aufgabe)item.Tag).Bezeichnung == "Extra Kunde") { // Wenn ExtraKunde wird true als extra weitergegeben. //Open_NeuerAuftrag(true); Open_Liste(true); } Fach_speichern(); // Gleiches Fach mit neuem Auftrag = Update. } /// /// NeuerAuftrag wird geöffnet und Ergebnis verarbeitet. /// /// Wenn ExtraKunde in Fach dann true, sonst false private void Open_NeuerAuftrag(bool extra) { FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.Userid); if (neuerAuftrag.ShowDialog() == DialogResult.OK) { if (extra) this.extraAuftrag = neuerAuftrag.Auftrag; else this.auftrag = neuerAuftrag.Auftrag; Fach_speichern(); // Gleiches Fach mit neuem Auftrag = Update. } } /// /// Auftragliste aufrufen. /// /// Wenn Extrakunde dann true private void Open_Liste(bool extra) { //auftragsliste = new List(Auftrag.GetRampeAuftragList()); //FormListe liste = new FormListe(auftragsliste, 3); //switch (liste.ShowDialog()) //{ // case DialogResult.None: // break; // case DialogResult.OK: // if (extra) // { // this.extraAuftrag = liste.auftrag; // this.extraAuftrag.Status = AuftragStatus.Aufgelegt; // if (this.extraAuftrag.Save()[0] != 1) meldung.Speicherfehler(); // } // else // { // this.auftrag = liste.auftrag; // this.auftrag.Status = AuftragStatus.Aufgelegt; // if (this.auftrag.Save()[0] != 1) meldung.Speicherfehler(); // } // Fach_speichern(); // break; // case DialogResult.Cancel: // break; // case DialogResult.Abort: // break; // case DialogResult.Retry: // break; // case DialogResult.Ignore: // break; // case DialogResult.Yes: // Open_NeuerAuftrag(extra); // break; // case DialogResult.No: // break; // default: // break; //} } /// /// Fach wird gespeichert. Bei Änderungen wird Fach überschrieben. Wenn FachID = 0 oder null wird neues Fach erstellt, sonst überschrieben. /// private void Fach_speichern() { this.fach.AuftragID = (int)this.auftrag.AuftragID; this.fach.MaschineID = (int)this.maschine.MaschineID; this.fach.Gewaschen = DateTime.Now; this.fach.Gewicht = 0; this.fach.WProgrammID = 1; if (this.aufgabe != null) this.fach.AufgabeID = this.aufgabe.AufgabeID; else this.fach.AufgabeID = null; if (this.extraAuftrag != null) this.fach.ExtraAuftragID = this.extraAuftrag.AuftragID; else this.fach.ExtraAuftragID = null; if (this.fach.Save() == 1) Panel_Laden(false); } /// /// Value für Transport hat sich geändert und Fach wird gespeichert. /// /// /// private void Transport_ValueChanged(object sender, EventArgs e) { // Warten bis erster Transport durchgeführt wurde. while (_monitor.WS_1_Transport == true & _monitor.WS_2_Transport == true) { } if (_monitor.WS_1_Transport || _monitor.WS_2_Transport) { Maschine ms = (Maschine)this.maschine; // Fehlermeldung falls kein Auftrag erstellt wurde. if (this.auftrag != null) { // Nach Transport wird FachAufgabe und FachExtraAuftrag entfernt da diese nur für ein Fach gelten. this.aufgabe = null; this.extraAuftrag = null; // Wenn Fach nicht null ist wird für ein neues Fach die ID entfernt. Dadurch wird bei Save() neues Fach erzeugt. if (this.fach != null) this.fach.FachID = null; Fach_speichern(); } else { MessageBox.Show($"Kein Auftrag erstellt. LEERFACH wird eingegeben. Fach bitte im nachhinein bearbeiten."); } //WENN kein Kunde gewählt dann Fach mit KundeID 0. _monitor.WS_2_Transport = _monitor.WS_1_Transport = false; } //this.ResumeLayout(false); } //Wenn sich SPSDaten Transport ändert wird Event ausgelöst. (Bis jetzt mit Button ausgelöst) /// /// KEIN VERWEIS NOTWENDIG /// Wenn ESC gedrückt wird schließt sich das Fenster. /// /// /// protected override bool ProcessDialogKey(Keys keyData) { // Escape [ESC] schließt den Screen. if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape) { this.Close(); return true; } // Insert [Einfg] öffnet neuen Auftrag. if (Form.ModifierKeys == Keys.None && keyData == Keys.Insert) { // Neuer Auftrag wird geöffnet. Wenn nicht ExtraKunde wird false weitergegeben, sonst true. //Open_NeuerAuftrag(false); Open_Liste(false); return true; } // R-Taste [R] simuliert Transport. Sollte wenn SPS angeschlossen ist nicht mehr notwendig sein und deaktiviert werden. //TODO: Deaktivieren wenn SPS funktioniert. Transport wird simuliert. if (Form.ModifierKeys == Keys.None && keyData == Keys.R) { Cursor.Current = Cursors.WaitCursor; if (((Maschine)this.maschine).MaschineID == 1) { if (this.auftrag == null) MessageBox.Show($"Kein Kunde ausgewählt. Bitte JETZT erledigen.", "ACHTUNG", MessageBoxButtons.OK, MessageBoxIcon.Warning); else _monitor.WS_1_Transport = true; } if (((Maschine)this.maschine).MaschineID == 2) { if (this.auftrag == null) MessageBox.Show($"Kein Kunde ausgewählt. Bitte JETZT erledigen.", "ACHTUNG", MessageBoxButtons.OK, MessageBoxIcon.Warning); else _monitor.WS_2_Transport = true; } Cursor.Current = Cursors.Default; return true; } return base.ProcessDialogKey(keyData); } /// /// ShortCuts für /// /// /// private void FormWSVerfolgung_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.I) // Ctrl+I { e.Handled = true; e.SuppressKeyPress = true; toolStripDropDownButtonInfo.DropDown.Show(); } } } }