up score complétion normalisé dans le podium
This commit is contained in:
parent
c3a9bc52b2
commit
59398d14ba
8 changed files with 116 additions and 36 deletions
|
@ -1119,37 +1119,52 @@ public function podiumContributeursOsm(): Response
|
|||
// On suppose que le champ "osmUser" existe sur l'entité Place
|
||||
$placeRepo = $this->entityManager->getRepository(\App\Entity\Place::class);
|
||||
|
||||
// Récupérer les 10 contributeurs OSM les plus actifs (par nombre de lieux)
|
||||
// Nouvelle requête groupée pour tout calculer d'un coup
|
||||
$qb = $placeRepo->createQueryBuilder('p')
|
||||
->select('p.osm_user, COUNT(p.id) as nb')
|
||||
->select(
|
||||
'p.osm_user',
|
||||
'COUNT(p.id) as nb',
|
||||
'AVG((CASE WHEN p.has_opening_hours = true THEN 1 ELSE 0 END) +'
|
||||
. ' (CASE WHEN p.has_address = true THEN 1 ELSE 0 END) +'
|
||||
. ' (CASE WHEN p.has_website = true THEN 1 ELSE 0 END) +'
|
||||
. ' (CASE WHEN p.has_wheelchair = true THEN 1 ELSE 0 END) +'
|
||||
. ' (CASE WHEN p.has_note = true THEN 1 ELSE 0 END)) / 5 * 100 as completion_moyen'
|
||||
)
|
||||
->where('p.osm_user IS NOT NULL')
|
||||
->andWhere("p.osm_user != ''")
|
||||
->groupBy('p.osm_user')
|
||||
->orderBy('nb', 'DESC')
|
||||
->setMaxResults(300);
|
||||
->setMaxResults(100);
|
||||
|
||||
$podium = $qb->getQuery()->getResult();
|
||||
|
||||
// Pour chaque utilisateur, calculer le score de complétion moyen
|
||||
// Calcul du score pondéré et normalisation
|
||||
$maxPondere = 0;
|
||||
foreach ($podium as &$row) {
|
||||
$osmUser = $row['osm_user'];
|
||||
// Récupérer toutes les places de cet utilisateur
|
||||
$places = $placeRepo->createQueryBuilder('p')
|
||||
->where('p.osm_user = :osm_user')
|
||||
->setParameter('osm_user', $osmUser)
|
||||
->getQuery()->getResult();
|
||||
$total = 0;
|
||||
$sum = 0;
|
||||
foreach ($places as $place) {
|
||||
$score = $place->getCompletionPercentage();
|
||||
if ($score !== null) {
|
||||
$sum += $score;
|
||||
$total++;
|
||||
}
|
||||
$row['completion_moyen'] = $row['completion_moyen'] !== null ? round($row['completion_moyen'], 1) : null;
|
||||
$row['completion_pondere'] = ($row['completion_moyen'] !== null && $row['nb'] > 0)
|
||||
? round($row['completion_moyen'] * $row['nb'], 1)
|
||||
: null;
|
||||
if ($row['completion_pondere'] !== null && $row['completion_pondere'] > $maxPondere) {
|
||||
$maxPondere = $row['completion_pondere'];
|
||||
}
|
||||
$row['completion_moyen'] = $total > 0 ? round($sum / $total, 1) : null;
|
||||
}
|
||||
unset($row);
|
||||
// Normalisation des scores pondérés entre 0 et 100
|
||||
if ($maxPondere > 0) {
|
||||
foreach ($podium as &$row) {
|
||||
if ($row['completion_pondere'] !== null) {
|
||||
$row['completion_pondere_normalisee'] = round($row['completion_pondere'] / $maxPondere * 100, 1);
|
||||
} else {
|
||||
$row['completion_pondere_normalisee'] = null;
|
||||
}
|
||||
}
|
||||
unset($row);
|
||||
}
|
||||
// Tri décroissant sur le score normalisé
|
||||
usort($podium, function($a, $b) {
|
||||
return ($b['completion_pondere_normalisee'] ?? 0) <=> ($a['completion_pondere_normalisee'] ?? 0);
|
||||
});
|
||||
|
||||
return $this->render('admin/podium_contributeurs_osm.html.twig', [
|
||||
'podium' => $podium
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue