Temat: Wyznaczanie wydajności pracy maszyn w zadanych okresach
Witam,
Borykam się ostatnio z jednym problemem, zanim coś konkretnie zacznę robić chciałbym się poradzić bardziej doświadczonych kolegów.
Docelowo chodzi o wyznaczanie wydajności pracy maszyn w zadanym okresie czasu. Niby na pierwszy rzut oka nic nadzwyczaj skomplikowanego, ale jak zwykle diabeł tkwi w szczegółach.
Wydajność jest wyliczana na podstawie przyrostów z liczników odczytywanych co tydzień i następnie dzielonych przez całkowitą ilość godzin jakie w zadanym tygodniu mogła pracować dana maszyna, typowo 5 dni * 24h = 120h. Powiedzmy że z przyrostu z licznika odczytano 60h co daje 50% wydajności w okresie tygodnia.
Oczywiście w realnym świecie zdarzają się święta, urlopy, przestoje itp zakały które powodują, że wartość 120h zmienia się w obie strony.
Często zdarza się że produkcja rusza wcześniej i całkowity czas wynosi wtedy np 128 godzin, muszę to oczywiście uwzględniać w swoich obliczeniach wydajności. Ilość maszyn pracujących wówczas jest także mniejsza, bo pracuje tylko kilka gniazd produkcyjnych z kilkunastu.
Moje przemyślenia w tym temacie skupiają się oczywiście na takiej organizacji danych by było łatwo napisać algorytm do wyznaczania tych nazwijmy to "idealnych (100%) czasów pracy". Kluczem do sprawnej pracy jest odpowiednia organizacja danych obejmująca wszystkie niuanse opisane powyżej. Drugim moim zmartwieniem jest objętość danych: 365dni i ok 50 maszyn. Potrzebne są niewątpliwie pewne optymalizacje w tym zakresie. Oto moje pomysły jak do tej pory:
Planuję stworzenie tabeli opisującej tylko dni wolne od pracy i takie w których maszyny nie pracują przez 24 godziny. Dni wolnych jest mniej niż pracujących więc myślę że to będzie rozsądne rozwiązanie. Domyślnie każdy dzień spoza tabeli jest pracujący.
create table day_exceptions(
id integer unsigned not null auto_increment,
created datetime not null, // czas utworzenia wpisu, sprawa dyskusyjna, być może to wleci w przyszłości
day_exc date not null, // data danego wolnego dnia
machine_id integer unsigned not null, // numer maszyny której dotyczy dany rekord
hours tinyint unsigned not null default 0, // ilość godzin planowanej produkcji danego "wolnego" dnia {0, 8, 16, 24}h
primary key (id)
);Tyle jeśli chodziło by o przechowywanie danych, inna kwestia to dodawanie nowych danych, planuję dwie opcje:
1 - dodawanie pojedynczych dni do tabeli
2 - dodawanie zakresów dni, czyli powiedzmy od 1 maja 2009 do 5 maja 2009.
Tutaj zaczyna się problem kontroli poprawności wprowadzanych danych. Trzeba bowiem sprawdzić czy dla danej maszyny dana data nie jest już obstawiona. Na "łatwość" sprawdzania poprawności ma jak wiadomo organizacja samych danych w tabeli więc widać doskonale jak ważne jest dobre zaplanowanie wszystkiego. Wracamy więc do punktu wyjścia.
Jeśli drogi Forumowiczu dotarłeś aż tutaj to gratuluję Ci cierpliwości i oczekuję bardzo na wszelkie opnie, krytykę, jakieś inne pomysły czy rozwiązania które obejmą specyfikę tego problemu. Jedna dobra rada pozwoli potem zaoszczędzić sporo czasu. Jak zawsze dobry pomysł to podstawa.