Changes between Version 6 and Version 7 of UseCaseImplementations


Ignore:
Timestamp:
02/20/24 16:29:26 (11 months ago)
Author:
211012
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • UseCaseImplementations

    v6 v7  
    66|| 2 || Гласа онлајн ||
    77|| 3 || Прегледува вкупна излезност ||
    8 || 4 || Прегледува вкунпи резултати од избори со кандидат ||
     8|| 4 || Прегледува вкупни резултати од избори со кандидат ||
    99|| 5 || Прегледува избирачки список ||
    1010|| 6 || Прегледува изборни единици ||
     
    147147}}}
    148148Од безбедносни причини споменати погоре, идентификаторот на корисникот се зема од сесијата и соодветно од сервисот се бара листа на избори на кои најавениот корисник има право да гласа. Преку соодветниот репозиториум и прашалникот наведен во претходните фази и напишан во JPQL погоре, од базата се земаат потребните податоци. Истите се прикажуваат во паѓачка листа. Доколку корисникот се обиде да пристапи до оваа страница без претходна успешна валидација, по проверката за постоење на сесијата и валиден идентификатор, истиот ќе биде пренасочен кон страницата за најава.
     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
     172public 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}}}