예제 #1
0
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getEventPlayerStats()
 {
     return $this->hasMany(DotaEventPlayerStat::className(), ['event_id' => 'id']);
 }
예제 #2
0
 /**
  * Расчет призовых выплат
  * 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;
 }
예제 #3
0
 /**
  * обновляет кол-во очков по ставке пользователя в 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);
 }
예제 #4
0
 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);
 }
예제 #5
0
 /**
  * @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;
 }