Programm_Wirl/AA-Forms/FormWSVerfolgung.cs

392 lines
14 KiB
C#

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;
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<Aufgabe> 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);
}
}
/// <summary>
/// Controls werden hier bevor sie angezeigt werden berechnet. Danach werden sie Eingeblendet und der Cursor auf Default gestellt.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
/// <summary>
/// ScreenControls in Panel von Fachliste laden.
/// </summary>
/// <param name="neustart"> Wenn Neustart dann true sonst false.</param>
private void Panel_Laden(bool neustart)
{
// Fachliste holen damit letzter Auftrag vom Vortag übernommen werden kann.
List<WSFach> 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);
// 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);
}
}
}
/// <summary>
/// Wenn eine Info von der Statusleiste gewählt wurde.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
Fach_speichern(); // Gleiches Fach mit neuem Auftrag = Update.
}
/// <summary>
/// NeuerAuftrag wird geöffnet und Ergebnis verarbeitet.
/// </summary>
/// <param name="extra">Wenn ExtraKunde in Fach dann true, sonst false</param>
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.
}
}
/// <summary>
/// Fach wird gespeichert. Bei Änderungen wird Fach überschrieben. Wenn FachID = 0 oder null wird neues Fach erstellt, sonst überschrieben.
/// </summary>
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);
}
/// <summary>
/// Value für Transport hat sich geändert und Fach wird gespeichert.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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)
/// <summary>
/// KEIN VERWEIS NOTWENDIG
/// Wenn ESC gedrückt wird schließt sich das Fenster.
/// </summary>
/// <param name="keyData"></param>
/// <returns></returns>
protected override bool ProcessDialogKey(Keys keyData)
{
//TODO: Umbau in Switch.
// 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);
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);
}
/// <summary>
/// ShortCuts für
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
}
}
}