| 149 | |
| 150 | === Прегледува вкупни резултати од избори со кандидат |
| 151 | Оваа функционалност е достапна за сите корисници, без разлика дали се автеницирани и може да се пристапи на страницата /results. Приказот кој го добива корисникот изгледа вака: |
| 152 | [[Image(rezultati.png)]] |
| 153 | За приказ на оваа страница е одговорен следниот контролер: |
| 154 | {{{#!java |
| 155 | @GetMapping("/results") |
| 156 | public String totalResults(@RequestParam(required = false) Long realizationId, |
| 157 | Model m) |
| 158 | { |
| 159 | List<TotalCandidacyResults> total = voteService.resultsByCandidateElectionsRealization(realizationId); |
| 160 | m.addAttribute("candidacies", total); |
| 161 | m.addAttribute("realizationId", realizationId); |
| 162 | m.addAttribute("municipalities", municipalityService.findAll()); |
| 163 | m.addAttribute("realizations", candidatesElectionRealizationService.findAll()); |
| 164 | m.addAttribute("pollingStations", addressService.findAllPollingStations()); |
| 165 | m.addAttribute("realization",candidatesElectionRealizationService.findById(realizationId)); |
| 166 | m.addAttribute("replaceTemplate", "results"); |
| 167 | return "index"; |
| 168 | } |
| 169 | }}} |
| 170 | На страницата се прикажани филтри од кои во досегашната имплементација функционира само оној за избор на реализацијата. По избор на соодветните критериуми, со клик на копчето пребарај се испраќа GET барање кој го пречекува контролерот. Според избраната реализација се повикува функција од сервисот за реализации со кандидатури од каде што се добива листа од објекти од record-от TotalCandidacyResults. |
| 171 | {{{#!java |
| 172 | public record TotalCandidacyResults (Candidacy candidacy, Long voteCount, Double percent) {} |
| 173 | }}} |
| 174 | {{{#!java |
| 175 | @Override |
| 176 | public List<TotalCandidacyResults> resultsByCandidateElectionsRealization(Long realizationId) |
| 177 | { |
| 178 | CandidatesElectionRealization candidatesElectionRealization = candidatesElectionRealizationService.findById(realizationId); |
| 179 | List<TotalCandidacyResults> votes = voteRepository.countVotesByCitizenAndRealization(candidatesElectionRealization); |
| 180 | Long totalVotes = votes.stream().mapToLong(TotalCandidacyResults::voteCount).sum(); |
| 181 | return votes.stream() |
| 182 | .map(x -> new TotalCandidacyResults(x.candidacy(), x.voteCount(), x.voteCount() * 100.0 / totalVotes)) |
| 183 | .sorted(Comparator.comparing(TotalCandidacyResults::voteCount).reversed()) |
| 184 | .toList(); |
| 185 | } |
| 186 | }}} |
| 187 | За оваа цел, се зема избраната реалзација од репозиториумот за реалзиации со кандидат и потоа преку следниот прашалник со добиваат резултатите во облик кандидат - број на гласовите. За базата да не се оптеретува дополнително, процентот на гласовите се пресметува во сервисот. |
| 188 | {{{#!java |
| 189 | @Query("SELECT NEW mk.ukim.finki.eglas.records.TotalCandidacyResults(kan, COUNT(distinct cv), null) " + |
| 190 | "FROM Candidate k " + |
| 191 | "LEFT JOIN Candidacy kan ON kan.candidate = k AND kan.candidatesElectionRealization = :realization " + |
| 192 | "LEFT JOIN CandidacyVote cv ON cv.candidacy = kan " + |
| 193 | "WHERE kan is not null " + |
| 194 | "GROUP BY kan") |
| 195 | List<TotalCandidacyResults> countVotesByCitizenAndRealization(@Param("realization") CandidatesElectionRealization realization); |
| 196 | }}} |