/** * @return \yii\db\ActiveQuery */ public function getEventPlayerStats() { return $this->hasMany(DotaEventPlayerStat::className(), ['event_id' => 'id']); }
/** * Расчет призовых выплат * 1. загрузить модель фантазии по которой нужно сделать расчет * 2. получить рейтинг игроков, сыгравших в данной фантазии * 3. получить ставки пользователей на игроков по данной фантазии * 4. Просуммировать очки игроков в соответствии со ставками пользователей * 5. Отсортировать массив по убыванию. * 6. Получить массив распределения ставок пользователей по местам и массив * в котором представлено кол-во ставок пользователеей на каждое призовое место * 7. Получить колонку в матрице призовых, с которой будем работать * 8. Рассчитать процент выплат для каждой ставки * 9. Рассчитать сумму выплаты для каждой ставки * 10. Перечислить сумму выйгрыша на балланс пользователя, сделавшего ставку. * 11. Занести данну операцию в лог пользователя. * */ public function actionCalculatePrize() { echo '<pre>'; print_r('actionCalculatePrize'); echo '</pre>'; //die; // 1. загрузить модель фантазии по которой нужно сделать расчет $fantasyModel = DotaFantasy::findOne(7); $event_id = $fantasyModel->event_id; // 2. получить рейтинг игроков, сыгравших в данной фантазии $players_rating = DotaEventPlayerStat::getRatingForEvent($event_id); // 3. получить ставки пользователей на игроков по данной фантазии $users_players_draft = []; foreach ($fantasyModel->dotaDraft as $draft) { switch ($fantasyModel->draft_id) { case DotaFantasy::DOTA_PLAYERS_DRAFT_ID: $users_players_draft[$draft->user_id] = ArrayHelper::map($draft->dotaDraftPlayers, 'id', 'account_id'); break; case DotaFantasy::DOTA_HEROES_DRAFT_ID: break; case DotaFantasy::DOTA_MIXED_DRAFT_ID: break; } } // 4. Просуммировать очки игроков в соответствии со ставками пользователей $scores_arr = []; foreach ($users_players_draft as $user_id => $user_draft) { $summ = 0; foreach ($user_draft as $account_id) { $summ += isset($players_rating[$account_id]) ? $players_rating[$account_id] : 0; } $scores_arr[$user_id] = $summ; } // без одинаковых очков $scores_arr = [19 => 780.14, 14 => 432.94, 20 => 631.01, 23 => 621.04, 12 => 321.1, 10 => 415.14, 24 => 508.26, 18 => 319.05, 45 => 194.05, 44 => 694.5]; /**/ /* // есть 2 одинаковых $scores_arr = [ 79 => 694.50, 19 => 621.04, 14 => 432.94, 20 => 631.01, 23 => 621.04, 12 => 631.01, 10 => 580.14, 24 => 508.26, 18 => 319.05, 45 => 194.05, 44 => 694.50, ]; /**/ /* // есть 3 одинаковых по 2 раза $scores_arr = [ 19 => 580.14, 14 => 432.94, 20 => 580.14, 23 => 621.04, 12 => 321.10, 10 => 580.14, 24 => 621.04, 18 => 621.04, 45 => 194.05, 44 => 694.50, ]; /**/ //echo'<pre>';print_r($scores_arr);echo'</pre>';//die; // 5. Отсортировать массив по убыванию. arsort($scores_arr); echo '<pre>'; print_r($scores_arr); echo '</pre>'; //die; // 6. Получить массив распределения ставок пользователей по местам и массив, // в котором представлено кол-во ставок пользователеей на каждое призовое место $places = $places1 = $equal_places = []; $place = $prev_scores = 0; $place1 = 1; foreach ($scores_arr as $k => $i) { if ($i != $prev_scores) { $place++; } $equal_places[$place][] = $k; $places[$k] = $place; $prev_scores = $i; $places1[$k] = $place1; $place1++; } echo '<pre>'; print_r($places); echo '</pre>'; //die; echo '<pre>'; print_r($places1); echo '</pre>'; //die; echo '<pre>'; print_r($equal_places); echo '</pre>'; //die; // 7. Получить колонку в матрице призовых, с которой будем работать $usersColumn = PrizeMatrix::getUsersColumn(count($places)); echo '$usersColumn<pre>'; print_r($usersColumn); echo '</pre>'; //die; // загружаем матрицу процентов $PrizeMatrix = PrizeMatrix::findOne(1); $PrizeMatrix->loadGrid(); // 8. Рассчитать процент выплат для каждой ставки $percents_arr = []; //$place = 1; foreach ($equal_places as $place_ => $places_) { //$percent = $PrizeMatrix->getPercent($place, count($places)); //$percent_part = floor(($percent / count($places_)) * 100) / 100; //$percent_part = $percent / count($places_); //foreach($places_ as $user_id) $places[$user_id] = $percent_part; $summ_percent = 0; //echo'<pre>';print_r($places_);echo'</pre>';//die; foreach ($places_ as $user_id) { $place = $places1[$user_id]; $percent = $PrizeMatrix->getPercent($place, count($places)); $summ_percent += $percent; } $percent_part = floor($summ_percent / count($places_) * 100) / 100; foreach ($places_ as $user_id) { $places[$user_id] = $percent_part; } //echo'<pre>$summ_percent = ';print_r($summ_percent);echo'</pre>';//die; } //die; //echo'<pre>$places ';print_r($places);echo'</pre>';//die; //проверка корректности расчета $summ = 0; foreach ($places as $place) { $summ += $place; } //echo'<pre>';print_r($summ);echo'</pre>';//die; // 9. Рассчитать сумму выплаты для каждой ставки //$fantasyModel->prize_pool = 7097; //$fantasyModel->prize_pool = 1000; $prizes = []; foreach ($places as $user_id => $percent) { $prizes[$user_id] = floor($fantasyModel->prize_pool * ($percent / 100) * 100) / 100; } //$prizes[$user_id] = $fantasyModel->prize_pool * ($percent / 100); echo '<pre>$fantasyModel->prize_pool = '; print_r($fantasyModel->prize_pool); echo '</pre>'; //die; echo '<pre>'; print_r($prizes); echo '</pre>'; //die; //проверка корректности расчета $summ = 0; foreach ($prizes as $prize) { $summ += $prize; } echo '<pre>'; print_r($summ); echo '</pre>'; //die; // 10. Перечислить сумму выйгрыша на балланс пользователя, сделавшего ставку. //User::updateUserDeposit(-10, 14); // 11. Занести данну операцию в лог пользователя. die; }
/** * обновляет кол-во очков по ставке пользователя в MixedDraft * * @param int $draft_id * @param int $event_id * @param $data * @return bool */ public static function setScoresForMixedDraft($draft_id = 0, $event_id = 0, $data) { //echo'<pre>';print_r($draft_id);echo'</pre>';//die; //echo'<pre>';print_r($event_id);echo'</pre>';//die; //echo'<pre>';print_r($data);echo'</pre>';die; $scores = DotaEventPlayerStat::getSummScoresForAccounts($event_id, $data['players']); //echo'<pre>';print_r($scores);echo'</pre>';//die; $scores += DotaEventHeroStat::getSummScoresForHeroes($event_id, $data['heroes']); //echo'<pre>';print_r($scores);echo'</pre>';die; $data = ['`scores`' => $scores]; $where = ['`id` = ' . $draft_id]; return self::updateRow($data, $where); }
public function checkPlayersStat($event, $rows) { $find = '_corr'; $event_id = $event->id; //echo'<pre>';print_r($event);echo'</pre>';die; foreach ($rows as $field => $row) { $pos = strpos($field, $find); if ($pos !== false) { foreach ($row as $account_id => $val) { $values = [$field => $val]; $where = ['event_id = ' . $event_id, 'account_id = ' . $account_id]; DotaEventPlayerStat::updateRow($values, $where); } } } // перерасчет кол-ва очков у каждого игрока DotaEventPlayerStat::calculateScores($event); }
/** * @return bool */ public static function updateDotaDraftPrizes() { // 1. получить список активных фантазий (активность из event) $events = DotaEvent::getActualEventsList(); $event_ids = ArrayHelper::map($events, 'id', 'id'); $fantasies = DotaFantasy::getActiveFantasies($event_ids); echo '<pre>'; print_r($fantasies); echo '</pre>'; //die; $DotaDraft = new DotaDraft(); foreach ($fantasies as $fantasy) { $fantasyModel = DotaFantasy::findOne($fantasy['id']); $stat_heroes_on_event = DotaEventHeroStat::isPresentHeroesStatInEvent($fantasyModel->event_id); $stat_players_on_event = DotaEventPlayerStat::isPresentPlayersStatInEvent($fantasyModel->event_id); //echo'<pre>';print_r($fantasyModel->name);echo'</pre>';//die; //echo'<pre>';var_dump($stat_heroes_on_event);echo'</pre>';//die; //echo'<pre>';var_dump($stat_players_on_event);echo'</pre>';//die; //если статистики по матчам еще нет - дальше не обрабатываем if (DotaEventHeroStat::isPresentHeroesStatInEvent($fantasyModel->event_id) === false && DotaEventPlayerStat::isPresentPlayersStatInEvent($fantasyModel->event_id) === false) { continue; } //echo'<pre>';print_r($fantasy_id);echo'</pre>';die; $DotaFantasy = new DotaFantasy(); $places = $DotaFantasy->calculatePlacesInFantasy($fantasyModel); //echo'<pre>';print_r($places);echo'</pre>';//die; //проверка корректности расчета процентов по выйгрышу //if(PrizeMatrix::calculationIsCorrect($places) === false) return 1; $prizes = $DotaFantasy->calculatePrizesInFantasy($fantasyModel, $places); echo '<pre>'; print_r($prizes); echo '</pre>'; //die; //проверка корректности расчета сумм по выйгрышу //if(PrizeMatrix::calculationIsCorrect($places, $fantasyModel->prize_pool) === false) return 2; $DotaDraft->updatePrizeValues($prizes, $fantasy['id']); /* foreach($prizes as $user_id=>$value) { $values = [ 'prize' => $value, ]; $where = [ 'fantasy_id = ' . $fantasy['id'], 'user_id = ' . $user_id, ]; $DotaDraft->updateRow($values, $where); } */ } //die; return true; }