= Tema 3 - ER simulator = * Responsabili: Ionuț Bîrsu, Bogdan Firuți, Adriana Drăghici, * Deadline: 14.12.2018 * Deadline hard: 06.01.2019 - în perioada vacanței (15.12.2018 - 06.01.2019) nu se aplică depunctări * Data publicării: 28.11.2018 * Data ultimei modificări: 07.12.2018

Obiective
  • Aprofundarea noțiunilor de moștenire, agregare și interfațare
  • Utilizarea unor design patterns-urilor studiate la laborator si la curs
  • Lucrul cu structuri de date in context OOP
  • Lucrul cu fișiere de tip JSON
  • Respectarea unui coding-style
Cerințe

În cadrul acestei teme veți simula într-un design orientat pe obiecte un sistem simplificat de Emergency Room.

În cadrul implementării este obligatorie folosirea design pattern-ului Observer. Felul în care îl implementați este la latitudinea voastră. De asemenea puteți folosi și alte pattern-uri.

Detalii implementare

Simularea se desfășoară în runde.

Entitățile implicate în simulare sunt pacienții și cadrele medicale - asistentele, doctorii și tehnicienii pentru investigații (analize). Ne vom referi acestora pe parcursul acestui enunț și cu denumirile Patient, Nurse, Doctor, respectiv ER Technician.

O dată intrat în spital, un pacient poate trece prin mai multe etape: triaj, consultații la un doctor, operație, investigații, internare. Nu este obligatoriu să treacă prin toate etapele, ci va ajunge în ele pe baza tipului de afecțiune și a severității acesteia.

Entități

Caracteristici pacient:

  • Tipul afecțiunii
  • Severitatea afecțiunii - (o valoare între 0 și 100)
  • Cât de urgentă este afecțiunea - estimată în etapa de triaj
  • Tratamentul pe care îl urmează

Tipuri de acțiuni legate de pacient, care indică și etapa în care se va afla în următoarea rundă:

  • operate - trebuie operat în următoarea rundă
  • hospitalize - va fi internat, și i se va aplica periodic tratamentul
  • treatment - i s-a prescris un tratament și poate pleca acasă
  • not diagnosed - cazul inițial, cand ajunge la un medic si nu trecut încă prin etapa de investigații.

Tipuri de afecțiuni (definte și în enum-ul IllnessType din scheletul temei):

  • abdominal pain
  • allergic reaction
  • broken bones
  • burns
  • car accident
  • cuts
  • food poisoning
  • heart attack
  • heart disease
  • high fever
  • pneumonia
  • sport injuries
  • stroke

Tipuri de doctori:

Tip Afecțiuni tratate C1 C2
Cardiologist heart attack, heart disease 0.4 0.1
ER_Physician allergic reaction, broken bones, burns, car accident, cuts, high fever, sport injuries 0.1 0.3
Gastroenterologist abdominal pain, allergic reaction, food poisoning 0.5 -
General Surgeon abdominal pain, burns, car accident, cuts, sport_injuries 0.2 0.2
Internist abdominal pain, allergic reaction, food poisoning, heart disease, high fever, pneumonia 0.01 -
Neurologist stroke 0.5 0.1

C1: factorul de ameliorare a severității în urma consultului doctorului C2: factorul de ameliorare a severității în urma operației T = 22: factorul de ameliorare a severității în urma aplicării tratementului doctorului, are valoarea 22 pentru toți doctorii.

Doctorii de tip Cardiologist, ER_Physician, General Surgeon și Neurologist pot atât consulta cât și opera. Dacă un doctor din unul din aceste patru tipuri este și chirurg, atunci este marcat în fișierul de intrare al simulării ca isSurgeon true.

Pentru fiecare doctor se cunoaște și valoarea unei constante (maxForTreatment). Această constantă reprezintă severitatea maximă pe care o poate avea un pacient atunci când este consultat pentru a putea fi trimis acasă doar cu tratament. Doctorii consideră ca un pacient cu severitatea > maxForTreatment necesită investigații.

Acțiuni asupra pacienților

Consultația pacienților:

Când un pacient este văzut pentru prima dată de un medic (pacientul are starea not diagnosed), medicul stabilește dacă acesta poate fi trimis acasă cu un tratament (dacă severitatea sa este mai mică decât maxForTreatment), sau dacă este nevoie ca pacientul să fie trimis la investigații.

Dacă pacientul a fost deja la investigații și are o stare stabilită de un ERTehnician, doctorul va putea lua o decizie asupra urmatoarei acțiuni. În acest moment, pacientul fie va fi operat, fie va fi internat, fie i se va prescrie un tratament și va fi trimis acasă.

Tratament: Dacă doctorul decide că pacientului i se va prescrie un tratament, pacientul va fi trimis acasă.

Internarea pacienților:

Atunci când doctorul consultă un pacient care trebuie spitalizat, îi calculează numărul de runde cât timp trebuie aplicat tratamentul după formula max(S*C1, 3), unde S este severitatea. Dupa aceea îi actualizează tratamentul pacientului cu numărul de runde și factorul T.

Totodată, doctorul va menține o listă a pacienților care sunt internați de catre el.

În fiecare rundă, asistentele administrează tratamentul pacienților spitalizați. Acestă acțiune reprezintă scăderea valorii severității cu valoarea T stabilită de doctor în urma consultației și a numărului de runde cât timp va fi aplicat tratamentul.

La finalul fiecărei runde, fiecare doctor va trece pe la pacienții săi să verifice dacă aceștia și-au terminat tratamentul (numărul de runde a ajuns la 0), sau dacă severitatea bolii pacienților a ajuns la 0. În cazul în care una din condiții este îndeplinită, pacientul este externat.

Operarea pacienților:

Atunci când doctorul operează un pacient îi aplică o scădere asupra severității conform formulei S = S-S*C2, unde S este severitatea.

După operație doctorul calculează numărul de runde cât timp trebuie aplicat tratamentul după formula max(S*C1, 3) și îi actualizează tratamentul pacientului cu numărul de runde și factorul T.

După operație pacientul rămâne spitalizat (internat).

Etape

Etapele prin care trece un pacient sunt simulate sub formă de stări (e operat, spitalizat) sau cozi. Vom utiliza termenii în engleză, ei corespund și mesajelor afișate ca rezultat al simulării.

* În timpul fiecărei runde:

  • se adaugă pacienți noi
  • se informează ce cadre medicale devin disponibili, dintre cei necesari în acea etapă. De exemplu în ExaminationsQueue avem nevoie doar de doctori, nu și se asistente.

Triage Queue

  • Este prima etapă prin care trece pacientul.
  • Asistentele triază pacienții pe baza afecțiunii și severității acesteia, atribuindu-le un nivel de urgență. Scheletul de cod oferă în acest scop clasa UrgencyEstimator și enum-ul Urgency.
  • Fiecare asistentă va consulta un singur pacient.
  • La începutul unei runde:
    • pacienții sunt atribuiți către cadrele medicale disponbile pentru a fi triați
    • pacienții neatribuiți rămân în coada pentru runda următoare.
  • După această etapă pacienții examinați vor fi adaugați în Examinations Queue

Examination Queue

* Reprezintă etapa în care pacienții așteaptă pentru a fi consultați de către un doctor. * Pacienții vor fi ordonați după urgența afecțiunii * Această coadă funcționează ca un sistem de liste de așteptare pentru fiecare doctor. Un doctor poate trata mai multe tipuri de afecțiuni, deci el va putea fi în mai multe liste în același timp. Va trebui ca atunci când un medic consultă un pacient, acesta să fie scos din toate aceste liste și adăugat la finalul lor. * La începutul unei runde:

  • pacienții sunt atribuiți către doctorii disponbili pentru a fi consultați
  • dacă un pacient are nevoie de operație, este atribuit primului chirurg care îi poate trata afecțiunea, iar dacă nu este nici unul disponibil, pacientul este transferat la un alt spital.
  • la finalul rundei toți pacienții din coadă vor fi consultați

* După această etapă pacienții:

  • Pot pleca acasă, cu tratament, dacă doctorii decid ca nu e nimic grav, sau dacă au fost văzuți de un ERTehnician și acesta a decis că pacientului i se poate prescrie o rețetă
  • Pot fi trimiși în Investigations Queue, unde vor fi examinați de un ER Tehnician
  • Pot fi operați, dacă au fost văzuți de un ER Tehnician și acesta a decis că pacientul trebuie operat
  • Pot fi internați, dacă ER Tehnician a stabilit că pacientul trebuie internat

Investigations Queue

  • La începutul unei runde:
    • pacienții sunt atribuiți către ER technicians disponbili pentru a li se face analize (investigații)
    • pacienții neatribuiți rămân în coada pentru runda următoare.
  • După această etapă pacienții ajung în Examinations Queue, oricare ar fi rezultatul investigațiilor
  • Pacienții vor fi ordonați după urgența afecțiunii

ER Tehnician

  • fiecare ERTehnician va analiza starea unui singur pacient aflat în Investigations Queue.
  • va decide dacă pacientul trebuie operat, internat, sau dacă acestuia i se poate prescrie un tratament, în funcție de constantele C1 și C2 și de severitate (S).
  • C1 = 75, C2 = 40
  • S > C1 → pacientul trebuie operat
  • C1 ≥ S > C2 → pacientul trebuie internat
  • S ≤ C2 → pacientul poate fi trimis acasă pe baza unei rețete prescrise de un medic.
  • rolul lui este sa ofere o sugestie, iar tot doctorul ia decizia in etapa de examinations.

Disclaimer: entitățile, rolurile și interacțiunile sunt doar inspirate din realitate, deci pot fi greșeli sau simplificări nerealiste ale sistemului real

Date de intrare - ieșire

Datele de intrare sunt sub forma unor fișiere în format JSON, fiecare fișier corespunzând unei simulări și specificând toate detaliile acesteia, atât entitățile implicate cât și rundele.

Rezultatele unei simulări se scriu în fișiere de output ce vor fi comparate de către checker cu cele de referință. Aceste fișiere conțin mesaje cu acțiunile petrecute în fiecare rundă și starea pacienților.

În cadrul temei va trebui să citiți și să parsați fișierele de intrare. Vă recomandăm biblioteca descrisă în acest tutorial: JSON & Jackson.

Mesajele afișate pentru fiecare rundă:

~~~~ Patients in round [nr_runda] ~~~~
[nume_pacient] is in [nume_coada] queue

~~~~ Nurses treat patients ~~~~
Nurse [id_nurse] treated [nume_pacient] and patient has [nr_runde] more rounds

~~~~ Doctors check their hospitalized patients and give verdicts ~~~~
[tip_doctor] says that [nume_pacient] should remain in hospital
[tip_doctor] sent [nume_pacient] home
  • Pentru pacienti mesajele sunt cele din enum-ul State oferit in scheletul temei
  • Mesajele pentru pacienți sunt ordonate crescător în funcție de numele pacientului
  • Mesajele pentru asistente sunt ordonate crescător în funcție de numele pacientului
  • Mesajele pentru doctori sunt ordonate după ordinea doctorilor din fișierul de intrare

Entry-point-ul pentru rularea temei trebuie să fie o clasă Main, care primește ca parametru numele fișierului de test.

Structură arhivă

Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:

  • fișierul Main.java (entry-point-ul aplicatiei voastre care nu se află în vreun pachet)
  • alte fișiere cu implementarea voastră
    • recomandăm să fie organizate pe pachete
    • fisierele din scheletul temei sunt considerate ca parte a implementării voastre. Vă oferă constantele cu denumiri și diverșii coeficienți necesari dezvoltarii soluției si afișării mesajelor de output. Le puteți organiza cum doriți sau să le modificați.
  • fișierul README

Nu încărcați fișierele de test, checker-ul sau documente generate cu JavaDoc.

Nu incarcați fisierul poo_checks.xml. Versiunea acestui fișier este cea din checker. Daca considerați ca anumite reguli din checkstyle trebuie schimbate, deschideți un issue pe pagina de GitHub a organizației.

Notare
  • 80p teste publice (10 de teste a cate 8p fiecare)
  • 15p organizare și design
  • 5p README (care surprinde cele mai relevante detalii de implementare)
  • 10% BONUS pentru trimirerea temei pana pe data de 14.12.2018 (inclusiv)

Checkstyle-ul va efectua doar o verificare, dar nu va putea aduce un punctaj adițional. Totuși, la peste 30 de erori rezultate din acesta, se va scădea câte 1p (din 100) pentru fiecare warning.

Exemple punctare:

  • 10 teste OK, README, 0 checkstyle warnings → 100p
  • 10 teste OK, README, 30 checkstyle warnings → 100p
  • 10 teste OK, README, 31 checkstyle warnings → 69p
  • 10 teste OK, README, 55 checkstyle warnings → 45p

Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va duce la anularea punctajului de pe parcursul semestrului şi repetarea materiei atât pentru sursă(e) cât şi pentru destinație(ii), fără excepție.

You shall indeed not pass!

Resurse
  • Scheletul de cod și checkerul tema3
Referințe
poo-ca-cd/arhiva/teme/2018/tema3.txt · Last modified: 2020/07/28 23:08 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0