game2006api/webapp/controller/EventRankingController.class.php
hujiabin ee31a8c76a 1
2022-11-16 14:51:54 +08:00

282 lines
12 KiB
PHP

<?php
require_once('models/User.php');
require_once('models/Guild.php');
require_once('mt/EventRanking.php');
require_once('services/RankActivityService.php');
use models\User;
use models\Guild;
class EventRankingController extends BaseAuthedController
{
public function eventRankingList(){
$this->_rspData(array(
'list' => mt\EventRanking::getEventRankingList()
));
}
public function activityRankingList()
{
$wave = getReqVal('wave', 0);
$type = getReqVal('type', 0);
if (!$wave || !$type){
$this->_rspErr(1, "error param");
return;
}
$rankingData = $this->internalGetActivityRankData($wave,$type);
$this->_rspData(
array(
'ranking_list'=>$rankingData
)
);
}
private $myRanked = array();
private function internalGetActivityRankData($wave,$type){
$page = getReqVal('page', 1);
$size = getReqVal('size', 100);
$userInfo = $this->_getOrmUserInfo();
$this->myRanked = array(
'ranked' => -1,
'user' => User::toSimple($userInfo),
'value' => 0,
'rewardNum'=>0,
'extraRewardNum'=>0,
'modifytime' => 0,
);
$rankingList = array();
$pages = 0;
switch ($type){
case 1:{
$rows = myself()->_getSelfMysql()->execQuery(
// 'SELECT t1.*,@rownum := @rownum + 1 AS ranked FROM ' .
// '(SELECT * FROM t_rank_activity WHERE wave=:wave AND type=:type ORDER BY value DESC LIMIT 1200) t1,'.
// '( SELECT @rownum := 0 ) t2',
'SELECT * FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type ' .
'ORDER BY value DESC ' .
"LIMIT 1200",
array(
':wave' => $wave,
':type' => $type
)
);
$data = $this->paginate($rows,$page,$size);
$pages = $data['pages'];
$rankingList = $data['lists'];
// $pages = ceil(count($rows)/$size)>1?ceil(count($rows)/$size):0;
// $offset=($page-1)*$size;
// $ranked = 0;
// foreach ($rows as $row){
// $ranked+=1;
// if ($row['account_id'] == $myRanked['user']['account_id']) {
// $myRanked['ranked'] = $ranked;
// $myRanked['value'] = $row['value'];
// $myRanked['modifytime'] = $row['modifytime'];
// }
// if ($offset<$ranked && $ranked<=$offset+$size){
// array_push($rankingList, array(
// 'ranked' => $ranked,
// 'user' => User::toSimple(User::find($row['account_id'])),
// 'value' => $row['value'],
// 'modifytime' => $row['modifytime'],
// ));
// }
// }
} break;
case 2:{
$rows = myself()->_getSelfMysql()->execQuery(
'SELECT * FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type ' .
'ORDER BY value DESC ' .
"LIMIT 10",
array(
':wave' => $wave,
':type' => $type
)
);
$ranked = 0;
foreach ($rows as $row) {
$ranked += 1;
if ($row['account_id'] == myself()->_getAccountId()) {
$this->myRanked['ranked'] = $ranked;
$this->myRanked['value'] = $row['value'];
$this->myRanked['rewardNum'] = $this->celAward($wave,$type,$ranked)['rewardNum'];
$this->myRanked['extraRewardNum'] = $this->celAward($wave,$type,$ranked)['extraRewardNum'];
$this->myRanked['modifytime'] = $row['modifytime'];
}
array_push($rankingList, array(
'ranked' => $ranked,
'user' => User::toSimple(User::find($row['account_id'])),
'value' => $row['value'],
'rewardNum' => $this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'],
'extraRewardNum' => $this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'],
'modifytime' => $row['modifytime'],
));
}
} break;
case 3:{
$rows = myself()->_getSelfMysql()->execQuery(
'SELECT * FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type ' .
'ORDER BY value DESC ' .
"LIMIT 1800",
array(
':wave' => $wave,
':type' => $type
)
);
$data = $this->paginate($rows,$page,$size);
$pages = $data['pages'];
$rankingList = $data['lists'];
// $pages = ceil(count($rows)/$size)>1?ceil(count($rows)/$size):0;
// $offset=($page-1)*$size;
// $ranked = 0;
// foreach ($rows as $row){
// $ranked+=1;
// if ($row['account_id'] == $myRanked['user']['account_id']) {
// $myRanked['ranked'] = $ranked;
// $myRanked['value'] = $row['value'];
// $myRanked['modifytime'] = $row['modifytime'];
// }
// if ($offset<$ranked && $ranked<=$offset+$size){
// array_push($rankingList, array(
// 'ranked' => $ranked,
// 'user' => User::toSimple(User::find($row['account_id'])),
// 'value' => $row['value'],
// 'modifytime' => $row['modifytime'],
// ));
// }
// }
} break;
case 4:{
$rows = myself()->_getSelfMysql()->execQuery(
'SELECT guild_id,SUM(value) AS value FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type ' .
'GROUP BY guild_id '.
'ORDER BY value DESC ' .
"LIMIT 10",
array(
':wave' => $wave,
':type' => $type
)
);
$ranked = 0;
foreach ($rows as $row) {
$ranked += 1;
$guildDb = Guild::find($row['guild_id']);
// $guildDb = null;
if (!$userInfo['guild_id']){
$this->myRanked = array();
}else if($userInfo['guild_id'] && $userInfo['guild_id'] == $row['guild_id']){
$this->myRanked['ranked'] = $ranked;
$this->myRanked['user'] = array();
$this->myRanked['guild'] = Guild::toSimple($guildDb);
$this->myRanked['value'] = $row['value'];
$this->myRanked['rewardNum'] = $this->celAward($wave,$type,$ranked)['rewardNum'];
$this->myRanked['extraRewardNum'] = $this->celAward($wave,$type,$ranked)['extraRewardNum'];
$this->myRanked['modifytime'] = $row['modifytime'];
}else{
$guildDb = Guild::find($userInfo['guild_id']);
$value = myself()->_getSelfMysql()->execQuery(
'SELECT guild_id,SUM(value) AS value FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type AND guild_id=:guild_id ' .
'GROUP BY guild_id limit 1',
array(
':wave' => $wave,
':type' => $type,
':guild_id'=>$userInfo['guild_id']
)
);
$this->myRanked['user'] = array();
$this->myRanked['guild'] =Guild::toSimple($guildDb);
$this->myRanked['value'] =$value[0]['value'];
}
array_push($rankingList, array(
'ranked' => $ranked,
'user' => array(),
'guild'=>Guild::toSimple($guildDb),
'value' => $row['value'],
'rewardNum' => $this->celAward($wave,$type,$ranked)['rewardNum'],
'extraRewardNum' => $this->celAward($wave,$type,$ranked)['extraRewardNum'],
'modifytime' => $row['modifytime'],
));
}
} break;
}
$rankingData = array(
'type' => $type,
'pages' => $pages,
'rows' => $rankingList,
'my_ranked' => $this->myRanked
);
return $rankingData;
// print_r($rankingData);die;
}
private function paginate($rows,$page,$size){
$rankingList = array();
$pages = ceil(count($rows)/$size)>1?ceil(count($rows)/$size):0;
$offset=($page-1)*$size;
$ranked = 0;
foreach ($rows as $row){
$ranked+=1;
if ($row['account_id'] == myself()->_getAccountId()) {
$this->myRanked['ranked'] = $ranked;
$this->myRanked['value'] = $row['value'];
$this->myRanked['rewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'];
$this->myRanked['extraRewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'];
$this->myRanked['modifytime'] = $row['modifytime'];
}
if ($offset<$ranked && $ranked<=$offset+$size){
array_push($rankingList, array(
'ranked' => $ranked,
'user' => User::toSimple(User::find($row['account_id'])),
'value' => $row['value'],
'rewardNum' => $this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'],
'extraRewardNum' => $this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'],
'modifytime' => $row['modifytime'],
));
}
}
return array(
'pages' => $pages,
'lists' => $rankingList
);
}
private function celAward($wave,$type,$ranked){
$rankingMeta = \mt\EventRanking::findByWaveOrType($wave,$type);
$rewardNum = 0;
$extraRewardNum = 0;
if ($rankingMeta){
$rewardArr = explode('|',$rankingMeta['reward']);
$extraRewardArr = explode('|',$rankingMeta['extraReward']);
if($rewardArr){
foreach ($rewardArr as $value){
$temp = explode(',',$value);
if ($ranked<=$temp[0]){
$rewardNum+=$temp[1];
break;
}
}
}
if($extraRewardArr){
foreach ($extraRewardArr as $val){
$temp = explode(',',$val);
if ($ranked == $temp[0]){
$extraRewardNum+=$temp[1];
}
}
}
}
return array(
'rewardNum' => $rewardNum,
'extraRewardNum' => $extraRewardNum
);
}
}