This is an old revision of the document!
Table of Contents
Tema de Casă 1
Implementarea modului de aprovizionare (SCM - Supply Chain Management) pentru un sistem informatic dedicat unui lanț de restaurante
Termen de Predare: 20 noiembrie 2015, 23:55
Pondere: 10 p / 35
Obiective
Obiectivul temelor de casă este reprezentat de implementarea unui sistem informatic performant şi scalabil pentru gestiunea resurselor unei societăți comerciale de dimensiuni mari. În acest an universitar, organizaţia pentru care se va proiecta şi dezvolta acest pachet de programe este un lanț de restaurante.
Se va realiza implementarea mai multor module din cadrul aplicației ERP, pe parcursul a trei etape independente.
În cadrul acestei etape, sistemul informatic va fi capabil să interogheze servicii care rulează în alte maşini virtuale şi ale căror funcţionalităţi le cunoaşte, acestea fiind accesibile prin intermediul unei reţele de calculatoare.
După rezolvarea temei de casă, studentul va fi capabil să:
- proiecteze o aplicaţie având o structură distribuită pe componente care poate rula pe maşini diferite;
- modeleze comunicaţia între componentele distribuite ale aplicaţiei.
Cunoştinţele necesare pentru rezolvarea temei de casă sunt:
- programarea în limbajul Java;
- proiectarea și dezvoltarea unei baze de date folosind sistemul de gestiune MySQL;
- folosirea unei interfețe de programare pentru accesarea informațiilor dintr-o sursă de date (Java Database Connectivity / Java Persistence API);
- utilizarea tehnologiei RMI (Remote Method Invocation) pentru apelarea unor metode aparţinând unor obiecte existente într-o altă maşină virtuală, a căror definiţie se consideră cunoscută.
Enunț
Se dorește implementarea modulului de aprovizionare (SCM - Supply Chain Management) pentru un sistem informatic destinat gestiunii activității dintr-un lanț de restaurante.
Pentru a putea asigura meniul pentru o anumită zi, restaurantul trebuie să se aprovizioneze cu o serie de produse culinare, care pot fi livrate de anumiți furnizori. Informațiile cu privire la alimentele care pot fi comandate precum și transmiterea de solicitări pentru livrarea acestora sunt realizate prin intermediul unui agent de intermediere a comunicației, care face legătura dintre restaurant și diferiții producători. Acesta poate fi interogat pentru a se obține lista agenților economici către care pot fi plasate comenzi, lista produselor pe care aceștia le comercializează (împreună cu data de livrare și prețul lor), pentru a le rezerva pentru anumite perioade de timp (respectiv pentru a anula rezervarea), precum și pentru a plasa o comandă fermă.
1. Un furnizor de produse alimentare va interacționa doar cu agentul de intermediere a comunicației cu lanțul de restaurante. Accesul la metodele expuse va fi permis doar în situația în care între aceste entități este stabilită o legătură, în acest sens fiind implementat un meniu în mod text în cadrul componentei producător prin care vor fi accesate funcționalitățile de înregistrare, respectiv de deînregistrare de la nivelul agentului de intermediere.
Funcționalitățile pe care le expune un către agentul de intermediere sunt:
a) obținerea listei de materii prime pe care le comercializează; un obiect de tip Product este caracterizat prin preț unitar, cantitate disponibilă, unitate de măsură precum și un termen de fabricație (în situația în care un ingredient nu este disponibil în stoc în cantitatea solicitată, acesta poate fi livrat într-un interval de timp indicat de acest parametru, exprimat în număr de zile calendaristice), toate aceste informații fiind stocate în cadrul unei baze de date dedicate pentru fiecare agent comercial în parte:
public List<Product> getProductList();
b) precizarea unei oferte, pentru o listă de solicitări (un obiect de tip Demand conține denumirea unui produs precum și cantitatea acesteia), constând în prețul total și numărul de zile calendaristice după care aceasta poate fi livrată (dacă întregul volum, pentru toate ingredientele, este disponibil în stoc, acesta este 0, altfel se întoarce numărul de zile după care toate materiile prime ar putea fi furnizate):
public Offer getOffer(List<Demand> demands);
c) realizarea unei rezervări pentru un identificator unic și o listă de solicitări, generându-se oferta corespunzătoare; în momentul în care este făcută o rezervare, cantitățile asociate produselor vor fi retrase din stocul disponibil, pentru o perioadă de timp determinată, după care aceasta este anulată, dacă nu s-a realizat o comandă de aprovizionare între timp:
public Offer makeReservation(int reservationId, List<Demand>);
d) anularea unei rezervări pentru un identificator unic, întorcându-se o valoare de tip adevărat / fals după cum operația a fost realizată cu succes, respectiv cu eșec; această operație implică restaurarea stocurilor, pentru produsele implicate:
public boolean cancelReservation(int reservationId);
2. Un agent de intermediere facilitează comunicația dintre un furnizor și lanțul de restaurante, expunând către fiecare dintre acestea anumite funcționalități:
CĂTRE FURNIZOR
a) metoda registerSupplier() permite înregistrarea unui furnizor la agentul de intermediere; doar în cazul în care furnizorul este înregistrat la agentul de intermediere, acesta poate fi interogat cu privire la produsele pe care le comercializează; metoda are ca semnătură:
- parametri: denumirea (trebuie să fie unică) și descrierea furnizorului;
- valoarea întoarsă: un identificator, generat de agentul de intermediere, prin care furnizorul este referit în mod unic la nivelul acestuia.
public int registerSupplier(String name, String description);
b) metoda unregisterSupplier() permite deînregistrarea unui furnizor de la agentul de intermediere; în acest moment, toate informațiile stocate referitor la nivelul agentului de intermediere cu privire la furnizorul respectiv sunt eliminate; metoda are semnătura:
- parametru: identificatorul unic prin care furnizorul este referit de agentul de intermediere;
- valoarea întoarsă: o valoare de tip adevărat / fals, care indică dacă operația a fost realizată cu succes sau s-a produs o excepție.
public boolean unregisterSupplier(int registrationId);
CĂTRE LANȚUL DE RESTAURANTE
a) metoda getSupplierList() furnizează o listă cu furnizorii care pot fi interogați la un moment dat; obiectul de tip Supplier conține informații cu privire la un producător cum ar fi denumirea și descriera:
public List<Supplier> getSupplierList();
b)
public Map<String, List<Product>> getProductList(List<String> suppliers);
c)
public Map<String, Offer> getOffers(List<Demand> demands);
d)
public int makeReservation(String supplier, List<Demand> demands);
e)
public boolean cancelReservation(int reservationId);
f)
public boolean makeOrder(int reservationId);
3. Un lanț de restaurante accesează informațiile de care dispune agentul de intermediere a comunicației cu producătorii de produse alimentare.
Un meniu, specific unei anumite date calendaristice, este format din mai multe feluri de mâncare. Acesta este caracterizat prin tip (aperitiv, fel principal, desert), denumire precum și ingrediente (denumire și cantitate, pentru care este asociată și o unitate de măsură). De asemenea, pentru fiecare meniu se indică și cantitățile din fiecare tip de fel de mâncare care vor fi pregătite pentru data calendaristică respectivă, astfel încât să se cunoască volumul de preparate care trebuie procurate. Pentru fiecare meniu se reține și starea sa (dacă s-a realizat procesul de aprovizionare corespunzător sau nu).
Precizări suplimentare
Pentru un producător, datele specifice (denumirea și descrierea) vor fi precizate sub formă de parametri în linia de comandă în momentul lansării sale în execuție.
Perioada pentru care o rezervare este menținută este exprimată în număr de zile calendaristice și se exprimă sub formă de constantă la nivelul codului sursă.
În cazul agentului de intermediere a comunicației, informațiile cu privire la entitățile cu care există o conexiune nu vor fi stocate în baza de date. Acestea sunt disponibile doar atâta timp cât respectiva componentă se găsește în execuție, fiind pierdute în momentul în care aceasta nu mai rulează sau în cazul în care se produce o eroare. Astfel, legăturile existente nu sunt refăcute atunci când o astfel de componentă este (re)pornită.
De remarcat este și faptul că agentul de intermediere expune funcționalități de tip server atât către componenta de tip furnizor cât și către componenta de tip lanț de restaurante. În această situație, se va asigura faptul că pentru fiecare entitate vor fi accesibile doar metodele specifice, fără a se expune și operațiile aferente altor aplicații.
Semnăturile metodelor accesibile la distanță pot suferi modificări în funcție de necesități, însă trebuie să implementeze funcționalitatea descrisă.
Nu este necesar să se implementeze o interfață grafică pentru testarea aplicațiilor, fiind suficient un meniu în mod text care să permită introducerea unui număr de opțiuni corespunzător numărului de metode pe care o componentă le poate accesa la distanță.
Barem de corectare și notare
| Punctaj | Criterii de acordare |
|---|---|
| x p |
BONUS. Se pot obţine punctaje suplimentare, astfel:
- 0,50 p – predarea şi prezentarea temei cu o săptămână mai devreme (înainte de xx.xx.2015, 23:55);
Condiții de realizare și predare
Tema va fi realizată individual şi va fi prezentată în cadrul laboratorului, până la sfârşitul semestrului. Neprezentarea temei de casă sau un rezultat nesatisfăcător al prezentării (necunoașterea funcționalității aplicației / codului sursă, imposibilitatea de a răspunde la întrebări) atrag după sine anularea punctajului corespunzător acesteia. În cadrul prezentării veţi specifica succint funcţionalităţile pe care le-aţi dezvoltat şi veţi răspunde la întrebări cu privire la modul de implementare al acestora.
Tema va trebui încărcată pe site-ul cs.curs.pub.ro sub forma unei arhive de tip .zip (având denumirea Grupa34XCX_NumePrenume_Tema1.zip) care să conţină script-ul pentru crearea şi popularea tabelelor din baza de date (numele bazei de date fiind Grupa34XCX_NumePrenume) – în rădăcina, sursele aplicaţiei (proiect Eclipse / NetBeans) precum şi un README în care să explicaţi funcționalitățile dezvoltate, problemele întâlnite și modul de soluționare a acestora. Temele care nu respectă convențiile de nume indicate nu vor fi luate în considerare. Prezentarea se poate face numai după ce tema a fost încărcată pe site.
Încărcarea pe site nu este redundantă, temele vor fi comparate prin aplicaţii specializate pentru a se depista eventualele fraude. În această situaţie, întreg punctajul pe parcursul semestrului va fi anulat, studenţii implicaţi (atât originalul, cât şi copia / copiile) fiind obligaţi să repete disciplina – cu taxă – în anul universitar următor.
