コード例 #1
0
 /**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = PrizeMatrix::find();
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     $this->load($params);
     if (!$this->validate()) {
         // uncomment the following line if you do not want to return any records when validation fails
         // $query->where('0=1');
         return $dataProvider;
     }
     $query->andFilterWhere(['id' => $this->id]);
     $query->andFilterWhere(['like', 'matrix', $this->matrix]);
     return $dataProvider;
 }
コード例 #2
0
ファイル: Fantasy.php プロジェクト: aldegtyarev/fantasy
 /**
  * распределяет места по ставкам пользователей
  * в формате массива
  * [
  *  user_id => percent value
  * ]
  * @param $fantasyModel Fantasy
  * @return array
  */
 public function calculatePlacesInFantasy($fantasyModel)
 {
     $event_id = $fantasyModel->event_id;
     // 2. получить рейтинг игроков, сыгравших в данной фантазии
     $eventPlayerStat = $fantasyModel->eventPlayerStat;
     $players_rating = $eventPlayerStat->getRatingForEvent($event_id);
     //echo'<pre>';print_r($players_rating);echo'</pre>';die;
     // 3. получить ставки пользователей на игроков по данной фантазии
     $users_players_draft = $fantasyModel->usersPlayersDraft;
     /*
     $users_players_draft = [];
     foreach($fantasyModel->dotaDraft as $draft) {
         switch($fantasyModel->draft_id) {
             case self::DOTA_PLAYERS_DRAFT_ID:
                 $users_players_draft[$draft->user_id] = ArrayHelper::map($draft->dotaDraftPlayers, 'id', 'account_id');
                 break;
             case self::DOTA_HEROES_DRAFT_ID:
                 break;
             case self::DOTA_MIXED_DRAFT_ID:
                 break;
         }
     }
     */
     //echo'<pre>';print_r($users_players_draft);echo'</pre>';die;
     //echo'<pre>';print_r($fantasyModel->dotaDraft);echo'</pre>';die;
     // 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;
     }
     //echo'<pre>';print_r($scores_arr);echo'</pre>';die;
     // без одинаковых очков
     /*
             $scores_arr = [
                 19 => 780.14,
                 14 => 432.94,
                 20 => 631.01,
                 23 => 621.04,
                 12 => 321.10,
                 10 => 415.14,
                 24 => 508.26,
                 18 => 319.05,
                 45 => 194.05,
                 44 => 694.50,
             ];
             /**/
     /*
             // есть 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'$places<pre>';print_r($places);echo'</pre>';//die;
     //		echo'<pre>';print_r($places1);echo'</pre>';//die;
     //		echo'<pre>';print_r($equal_places);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;
     }
     return $places;
 }
コード例 #3
0
 /**
  * Finds the DotaPrizeMartx model based on its primary key value.
  * If the model is not found, a 404 HTTP exception will be thrown.
  * @param integer $id
  * @return DotaPrizeMartx the loaded model
  * @throws NotFoundHttpException if the model cannot be found
  */
 protected function findModel($id)
 {
     if (($model = PrizeMatrix::findOne($id)) !== null) {
         $model->loadGrid();
         return $model;
     } else {
         throw new NotFoundHttpException('The requested page does not exist.');
     }
 }
コード例 #4
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;
 }
コード例 #5
0
 public function actionShowRatings($id)
 {
     $modelFantasy = new DotaFantasy();
     $model = $modelFantasy->loadFantasyInfo($id);
     //echo'<pre>';print_r($model);echo'</pre>';die;
     if ($model === false) {
         return;
     }
     $DraftModel = new DotaDraft();
     $rates_list = $DraftModel->getRatesListWithResults([$id]);
     $params = DotaParams::loadParams();
     $prizes = PrizeMatrix::getPrizesForFantasy($model);
     return $this->renderPartial('/common/show-ratings', ['model' => $model, 'rates_list' => $rates_list, 'params' => $params, 'prizes' => $prizes, 'game_id' => GamesParams::GAME_DOTA, 'game_name' => GamesParams::GAME_DOTA_NAME]);
 }