/** * 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; }
/** * распределяет места по ставкам пользователей * в формате массива * [ * 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; }
/** * 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.'); } }
/** * Расчет призовых выплат * 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; }
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]); }