| | 2 | |
| | 3 | Имплементирани се сите сценарија од фаза 3 со дополнителни подобрувања како: [[br]] |
| | 4 | Подобрување на начинот на избор на доделување на соба од страна на вработениот доколку студентот нема посебно барање за соба сега не е по случаен избор туку вработениот има уреден преглед до капацитетот на блоковите, спратовите, и зафатеност на соби ( дали се резервирани или не ) и врз основа на тоа го сместува студентот. |
| | 5 | За ова подобрување е додадена само една нова колона во табелата Block ( total_rooms ) која ја искористив за пресметка на капацитет по спратовите во блокот [[br]] |
| | 6 | |
| | 7 | Имплементирана е нова функционалност која не е дефинирана во фаза 3 а тоа е можност за барање на прекин на престој во собата од страна на студентот. [[br]] |
| | 8 | За оваа функционалност се додадени две нови колони во StudentTookRoom (end_stay_requested од тип boolean и requested_end_date од тип date) |
| | 9 | |
| | 10 | == Тригери |
| | 11 | |
| | 12 | Автоматско зголемување на капацитет на собата доколку има внесено краен датум на собата во која престојувал. |
| | 13 | |
| | 14 | |
| | 15 | {{{ |
| | 16 | CREATE OR REPLACE FUNCTION update_room_on_end_stay() |
| | 17 | RETURNS TRIGGER AS $$ |
| | 18 | BEGIN |
| | 19 | IF NEW.end_date IS NOT NULL THEN |
| | 20 | UPDATE project.room |
| | 21 | SET project.capacity = capacity + 1, |
| | 22 | project.is_available = TRUE |
| | 23 | WHERE project.room_number = NEW.room_num |
| | 24 | AND project.block_id = NEW.block_id::char(1); |
| | 25 | END IF; |
| | 26 | |
| | 27 | RETURN NEW; |
| | 28 | END; |
| | 29 | $$ LANGUAGE plpgsql; |
| | 30 | |
| | 31 | CREATE TRIGGER trg_update_room_on_end_stay |
| | 32 | AFTER UPDATE OF end_date |
| | 33 | ON project.studenttookroom |
| | 34 | FOR EACH ROW |
| | 35 | EXECUTE FUNCTION update_room_on_end_stay(); |
| | 36 | }}} |
| | 37 | |
| | 38 | |
| | 39 | Автоматско менување на статусот на собата доколку некој од прегледаните документи се со статус Declined |
| | 40 | |
| | 41 | |
| | 42 | {{{ |
| | 43 | CREATE OR REPLACE FUNCTION update_room_request_on_doc_decline() |
| | 44 | RETURNS TRIGGER AS $$ |
| | 45 | BEGIN |
| | 46 | IF NEW.d_status = 'Declined' THEN |
| | 47 | UPDATE roomrequest |
| | 48 | SET status = 'Declined' |
| | 49 | WHERE student_id = NEW.student_id |
| | 50 | END IF; |
| | 51 | |
| | 52 | RETURN NEW; |
| | 53 | END; |
| | 54 | $$ LANGUAGE plpgsql; |
| | 55 | |
| | 56 | CREATE TRIGGER trg_update_room_request |
| | 57 | AFTER UPDATE OF d_status |
| | 58 | ON dorm_document |
| | 59 | FOR EACH ROW |
| | 60 | EXECUTE FUNCTION update_room_request_on_doc_decline(); |
| | 61 | }}} |
| | 62 | |
| | 63 | |
| | 64 | |
| | 65 | |
| | 66 | == Трансакции |
| | 67 | |
| | 68 | Апликацијата користи трансакции во следните два фајла: [[br]] |
| | 69 | |
| | 70 | За доделување на соба на студентот |
| | 71 | src/main/java/org/example/dormallocationsystem/Service/Impl/EmployeeServiceImpl.java |
| | 72 | |
| | 73 | За плаќање на станарината за месец. |
| | 74 | src/main/java/org/example/dormallocationsystem/Service/Impl/PaymentServiceImpl.java |
| | 75 | |
| | 76 | |
| | 77 | == Индекси |
| | 78 | |
| | 79 | Бидејќи PostgresSQL има систем за креирање на индекси самостојно, во некои случаи каде одредени прашалници беа користени по често немаше потреба да креирам индекс, но во следните два случаеви PostgresSQL |
| | 80 | користеше секвенцијален scan (односно пребаруваше низ целата табела) во следниве два прашалниците кои се често употребуваат и исто така може значително да ја влијаат на перформансите доколку има повеќе податоци во нив: |
| | 81 | === Случај 1. |
| | 82 | Употребуван прашалник за преглед на документите на студентот: |
| | 83 | |
| | 84 | {{{ |
| | 85 | select * |
| | 86 | from project.dorm_document |
| | 87 | where student_id = [id]; |
| | 88 | }}} |
| | 89 | |
| | 90 | Анализа пред креиран индекс [[br]] |
| | 91 | Слика 1. |
| | 92 | |
| | 93 | |
| | 94 | Креиран индекс: |
| | 95 | |
| | 96 | {{{ |
| | 97 | create index idx_dorm_document_student_id on project.dorm_document(student_id); |
| | 98 | }}} |
| | 99 | |
| | 100 | Анализа после креиран индекс [[br]] |
| | 101 | Слика 2. |
| | 102 | |
| | 103 | === Случај 2. |
| | 104 | |
| | 105 | Употребуван прашалник за преглед на уплатената станарина од страна на студент |
| | 106 | |
| | 107 | {{{ |
| | 108 | select distinct s.u_id, s.faculty_name, s.gender, s.is_exempt, s.year_of_studies |
| | 109 | from project.student s |
| | 110 | where exists ( |
| | 111 | select 1 |
| | 112 | from project.payment p |
| | 113 | where s.u_id = p.student_id |
| | 114 | ); |
| | 115 | }}} |
| | 116 | |
| | 117 | Анализа пред креиран индекс [[br]] |
| | 118 | Слика 1. |
| | 119 | |
| | 120 | Креиран индекс: |
| | 121 | {{{ |
| | 122 | create index idx_payment_student_id on project.payment(student_id); |
| | 123 | }}} |
| | 124 | |
| | 125 | Анализа после креиран индекс [[br]] |
| | 126 | Слика 2. |
| | 127 | |
| | 128 | |
| | 129 | == Напредни прашалници |
| | 130 | |
| | 131 | Имплементирани се прашалниците за [[br]] |
| | 132 | |
| | 133 | Бројка на соби кои поради претходна зафатеност не се доделени на студентите кои ги побарале [[br]] |
| | 134 | И извештај за блокот |
| | 135 | |
| | 136 | [[slika-prasalnici]] |
| | 137 | |
| | 138 | |
| | 139 | Истите се наоѓаат во **src/main/java/org/example/dormallocationsystem/Web/EmployeeController.java** фајлот |
| | 140 | |
| | 141 | {{{ |
| | 142 | @GetMapping("/dashboard") |
| | 143 | public String employeeDashboard(@RequestParam Long employeeId, Model model) { |
| | 144 | List<Student> studentsAddedToRoom = studentService.getStudentsAddedToRoom(); |
| | 145 | List<Student> studentsThatNeedToBeReviewed = studentService.getStudentsWithNotReviewedDocs(); |
| | 146 | List<Studenttookroom> endStayRequests = studentTookRoomService.getPendingEndStayRequests(); |
| | 147 | List<BlockRoomReportDTO> blockReport = blockService.getBlockRoomReport(); |
| | 148 | List<RoomMismatchDTO> roomMismatches = roomRequestService.findRoomMismatches(); |
| | 149 | |
| | 150 | model.addAttribute("employeeId", employeeId); |
| | 151 | model.addAttribute("addedToRoomStudents", studentsAddedToRoom); |
| | 152 | model.addAttribute("studentsToReview", studentsThatNeedToBeReviewed); |
| | 153 | model.addAttribute("endStayRequests", endStayRequests); |
| | 154 | model.addAttribute("blockReport", blockReport); |
| | 155 | model.addAttribute("roomMismatches", roomMismatches); |
| | 156 | |
| | 157 | return "employee-dashboard"; |
| | 158 | } |
| | 159 | }}} |
| | 160 | |