Table of Contents

Tema 3 - ER simulator

Obiective

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:

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

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

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.

Triage Queue

Examination Queue

Investigations Queue

ER Tehnician

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

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ă:

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

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

Referințe