Wprowadzając do kontekstu zagadnienia,
Artykuł produkcyjny w ERP ma zdefiniowane m.in listę materiałową (z czego się składa) oraz marszrutę technologiczną (opisującą proces produkcyjny tego artykułu)
Marszruta technologiczna, składa się z operacji technologicznych ułożonych we właściwiej kolejności odwzorowującej proces produkcyjny danego wyrobu, różne wyroby różnie się produkuję dlatego też mają różne marszruty.
Każda operacja technologiczna ma parę parametrów m.in. kod stanowiska na jakim jest wykonywana, czasy normatywne, dział produkcyjny na jakim jest to stanowisko, zasoby itp.
Narzędzie poniżej służy do hurtowej zmiany jednego z parametrów operacji technologicznej (Tn) we wszystkich marszrutach zdefiniowanych w ERP, w zależności od tego jaka operacja technologiczna i z jakimi parametrami jest po danej operacji w tej samej marszrucie.
Generalnie narzędzie miało uporządkować coś raz i dlatego kod do niego wygląda tak jak niżej, czyli wszystko było w kodzie. Teraz obserwuje zjawisko ze coraz częściej są wprowadzane kolejne reguły globalne i coraz częściej musze to edytować w kodzie, chciałbym to zmienić.
Najpierw jak to wygląda teraz.
foreach (var marszruta in listaMarszrut)
{
for (int i = 0; i < marszruta.ListaOperacji.Count - 1; i++)
{
// (1) czas Tn pomiedzy roznymi działami.
if (marszruta.ListaOperacji[i].DzialOperacji != marszruta.ListaOperacji[i + 1].DzialOperacji)
{
marszruta.ListaOperacji[i].CzasNakl_h = "7.5";
marszruta.ListaOperacji[i].CzyZmieniona = true;
}
// (2) czas Tn pomiedzy operacjami na tych samych działach
if ((marszruta.ListaOperacji[i].DzialOperacji == marszruta.ListaOperacji[i + 1].DzialOperacji))
{
marszruta.ListaOperacji[i].CzasNakl_h = "0";
marszruta.ListaOperacji[i].CzyZmieniona = true;
}
// (3) czas Tn dla operacji jezeli najpierw jest magazyn a potem inny dzial niz magazyn
if (marszruta.ListaOperacji[i].DzialOperacji == DzialEnum.Magazyn && marszruta.ListaOperacji[i + 1].DzialOperacji != DzialEnum.Magazyn)
{
marszruta.ListaOperacji[i].CzasNakl_h = "16.01";
marszruta.ListaOperacji[i].CzyZmieniona = true;
}
// (4) czas Tn dla operacji magazynu jezeli po niej jest kolejna operacja magazynu
if (marszruta.ListaOperacji[i].DzialOperacji == DzialEnum.Magazyn && marszruta.ListaOperacji[i + 1].DzialOperacji == DzialEnum.Magazyn)
{
marszruta.ListaOperacji[i].CzasNakl_h = "0.01";
marszruta.ListaOperacji[i].CzyZmieniona = true;
}
// (5) czas Tn dla operacji Montaz0101 jezeli następną operacją jest operacja na dziale montazu pierwszego
if (marszruta.ListaOperacji[i].KodStanowiska == "Montaz0101" && marszruta.ListaOperacji[i + 1].DzialOperacji == DzialEnum.MontazPierwszy)
{
marszruta.ListaOperacji[i].CzasNakl_h = "2.25";
marszruta.ListaOperacji[i].CzyZmieniona = true;
}
// (6) czas Tn dla operacji Spawanie jezeli po niej jest operacja na Slusarni lub Warsztacie
if (marszruta.ListaOperacji[i].KodStanowiska == "Spawanie" && (marszruta.ListaOperacji[i + 1].DzialOperacji == DzialEnum.Warsztat || marszruta.ListaOperacji[i + 1].DzialOperacji == DzialEnum.Slusarnia))
{
marszruta.ListaOperacji[i].CzasNakl_h = "23.01";
marszruta.ListaOperacji[i].CzyZmieniona = true;
}
//(..duzo duzo wiecej regul...)
}
}
W tej pętli jest lista około 30 reguł od najbardziej ogólnej do najbardziej szczegółowych, chciałbym to zoptymalizować i uwolnić się od grzebania w kodzie, chciałbym to zrobić w dwóch etapach:
1 Etap - na już aby możliwie najszybciej zleceniodawca mógł sam już to robić, chciałbym te warunki z ifów pobierać z pliku tekstowego który w odpowiednim formacie (prostym dla nie programisty) mógłby tworzyć pracownik, importować te reguły do programu i program miałby to przerobić na instrukcje warunkowe w ifach.
2 Etap - docelowo ale może trochę poczekać, chciałbym definiowanie tych reguł przenieść do interfejsu użytkownika, tak aby budował sobie reguły wybierając kolejne opcje z ComboBoxów , Check'oów, RadioButton'ów itp.
Coś na kształt budowy kolejnych filtrów w Excelu.
To co chodzi mi po głowie:
-
Zbudować szkielety możliwych instrukcji warunkowych z wymiennymi parametrami w formie metod, i na bazie pobieranych danych z pliku konfiguracyjnego wybierać właściwą metodę, przekazywać pobrane parametry do niej i 'odkładać' ją do delegata - a po pobraniu wszystkich uruchomić wszystko z delegata - z tym że tu mam problem bo zależy mi aby uruchamiać te metody we właściwej kolejności od reguł najbardziej ogólnych do najbardziej szczegółowych a tego delegat nie da.
-
Utworzyć klasę 'Regula' coś na kształt tego niżej, i dane z pliku konfiguracyjnego przekształcać na takie obiekty 'Regul', odkładać je w jakimś słowniku gdzie kluczem byłoby coś (nie wiem jak odwzorować szkielet instrukcji warunkowej na klucz słownika) a wartością - wartość Tn do ustawienia dla danej reguły - ale w tym przypadku o ile reguły jak z kodu wyżej (1-5) jeszcze dałbym rade to dla przypadku (6) gdzie jest jakby zagnieżdżenie nie mam pomysłu jak to zrobić aby było i wygodne i czytelne i skalowalne
public class Regula {
public string StanowiskoOperacji { get; set; }
public string DzialOperacji { get; set; }
public string StanowiskoOperacjiNastepnej { get; set; }
public string DzialOperacjiNastepnej { get; set; }
public string OperatorPorownania { get; set; }
public string CzasTn { get; set; }
}
Prośba o nakierowanie jak rozwiązać ten problem, rozwiązanie dla tego przypadku będę na pewno wykorzystywał w innych narzędziach dlatego zależy mi na tym żeby to rozwiązanie było 'takie jak to się powinno robić' ;).
- Przechwytywanie.PNG (12 KB) - ściągnięć: 4