game2006api/webapp/controller/EventRankingController.class.php
hujiabin 12d51341f2 1
2022-11-22 17:44:55 +08:00

436 lines
20 KiB
PHP

<?php
require_once('models/User.php');
require_once('models/Guild.php');
require_once('models/EventRanking.php');
require_once('mt/EventRanking.php');
require_once('services/RankActivityService.php');
use models\User;
use models\Guild;
use models\EventRanking;
class EventRankingController extends BaseAuthedController
{
public function eventRankingList(){
$this->_rspData(array(
'list' => mt\EventRanking::getEventRankingList(),
'ceg' => EventRanking::getSumV()
));
}
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 \services\RankActivityService::KILLS_TYPE : {
$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'];
} break;
case \services\RankActivityService::WINS_TYPE : {
$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 \services\RankActivityService::BATTLES_TYPE : {
$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'];
} break;
case \services\RankActivityService::GUILD_TYPE : {
$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;
if (!$userInfo['guild_id']){
$this->myRanked['guild'] = array();
}
if($userInfo['guild_id'] && $userInfo['guild_id'] == $row['guild_id']){
$guildDb = Guild::find($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'];
}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?$value[0]['value']:0;
}
$guildDb = Guild::find($row['guild_id']);
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'],
));
}
} break;
}
$rankingData = array(
'type' => $type,
'pages' => $pages,
'rows' => $rankingList,
'my_ranked' => $this->myRanked
);
error_log(json_encode(
array(
'account_id'=>$userInfo['account_id'],
'guild_id'=>$userInfo['guild_id'],
'type' => $type,
'pages' => $pages,
'rows' => $rankingList,
'my_ranked' => $this->myRanked
)
));
return $rankingData;
}
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
);
}
public function settlementRankingAward(){
$currentRankingMeta = mt\EventRanking::getCurrentRanking();
$userInfo = $this->_getOrmUserInfo();
$myAward = array(
'ranked' => -1,
'rewardNum' => 0,
'extraRewardNum' => 0
);
if ($currentRankingMeta){
$lastRankingMeta = mt\EventRanking::find($currentRankingMeta['id']-1);
if ($lastRankingMeta){
switch ($lastRankingMeta['themeType']){
case \services\RankActivityService::KILLS_TYPE : {
$rows = myself()->_getSelfMysql()->execQuery(
'SELECT * FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type ' .
'ORDER BY value DESC ' .
"LIMIT 1200",
array(
':wave' => $lastRankingMeta['wave'],
':type' => $lastRankingMeta['themeType']
)
);
$ranked = 0;
foreach ($rows as $row){
$ranked+=1;
if ($row['account_id'] == myself()->_getAccountId()) {
$myAward['ranked'] = $ranked;
$myAward['rewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'];
$myAward['extraRewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'];
}
}
if ($myAward['ranked'] > 0){
//记录此活动的CEG奖励
$cegNum = $myAward['rewardNum']+$myAward['extraRewardNum'];
EventRanking::setV($lastRankingMeta['wave'],$lastRankingMeta['themeType'],$cegNum);
}
error_log(json_encode(array(
'myAward' => $myAward,
'ranking' => 'KillRanking',
'number'=>$myAward['rewardNum']+$myAward['extraRewardNum']
)));
$this->_rspOk();
};break;
case \services\RankActivityService::WINS_TYPE : {
$rows = myself()->_getSelfMysql()->execQuery(
'SELECT * FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type ' .
'ORDER BY value DESC ' .
"LIMIT 10",
array(
':wave' => $lastRankingMeta['wave'],
':type' => $lastRankingMeta['themeType']
)
);
$ranked = 0;
foreach ($rows as $row) {
$ranked += 1;
if ($row['account_id'] == myself()->_getAccountId()) {
$myAward['ranked'] = $ranked;
$myAward['rewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'];
$myAward['extraRewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'];
}
}
if ($myAward['ranked'] > 0){
//记录此活动的CEG奖励
$cegNum = $myAward['rewardNum']+$myAward['extraRewardNum'];
EventRanking::setV($lastRankingMeta['wave'],$lastRankingMeta['themeType'],$cegNum);
}
error_log(json_encode(array(
'myAward' => $myAward,
'ranking' => 'WinRanking',
'number'=>$myAward['rewardNum']+$myAward['extraRewardNum']
)));
$this->_rspOk();
};break;
case \services\RankActivityService::BATTLES_TYPE : {
$rows = myself()->_getSelfMysql()->execQuery(
'SELECT * FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type ' .
'ORDER BY value DESC ' .
"LIMIT 1800",
array(
':wave' => $lastRankingMeta['wave'],
':type' => $lastRankingMeta['themeType']
)
);
$ranked = 0;
foreach ($rows as $row){
$ranked+=1;
if ($row['account_id'] == myself()->_getAccountId()) {
$myAward['ranked'] = $ranked;
$myAward['rewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'];
$myAward['extraRewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'];
}
}
if ($myAward['ranked'] > 0){
//记录此活动的CEG奖励
$cegNum = $myAward['rewardNum']+$myAward['extraRewardNum'];
EventRanking::setV($lastRankingMeta['wave'],$lastRankingMeta['themeType'],$cegNum);
}
error_log(json_encode(array(
'myAward' => $myAward,
'ranking' => 'BattleRanking',
'number'=>$myAward['rewardNum']+$myAward['extraRewardNum']
)));
$this->_rspOk();
};break;
case \services\RankActivityService::GUILD_TYPE : {
$rows = myself()->_getSelfMysql()->execQuery(
'SELECT guild_id,wave,type,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' => $lastRankingMeta['wave'],
':type' => $lastRankingMeta['themeType']
)
);
$ranked = 0;
$guildAward = array(
'ranked' => -1,
'rewardNum' => 0,
'extraRewardNum' => 0
);
foreach ($rows as $row) {
$ranked += 1;
if($userInfo['guild_id'] && $userInfo['guild_id'] == $row['guild_id']){
$myAward['ranked'] = $ranked;
$guildAward['ranked'] = $ranked;
$guildAward['rewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'];
$guildAward['extraRewardNum'] = $this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'];
}
}
if ($myAward['ranked'] > 0){
//记录此活动的CEG奖励
$myValue = myself()->_getSelfMysql()->execQuery(
'SELECT * FROM t_rank_activity ' .
'WHERE wave=:wave AND type=:type AND account_id=:account_id',
array(
':wave' => $lastRankingMeta['wave'],
':type' => $lastRankingMeta['themeType'],
':account_id' => myself()->_getAccountId()
)
);
$sumValue = 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' => $lastRankingMeta['wave'],
':type' => $lastRankingMeta['themeType'],
':guild_id'=>$userInfo['guild_id']
)
);
if ($myValue && $sumValue ){
$myAward['rewardNum'] = $myValue[0]['value']/$sumValue[0]['value']*$guildAward['rewardNum'];
}
$guildDb = Guild::find($userInfo['guild_id']);
if ($guildDb && $guildDb['owner_id'] == myself()->_getAccountId() ){
$myAward['extraRewardNum'] = $guildAward['extraRewardNum'];
}
$cegNum = $myAward['rewardNum']+$myAward['extraRewardNum'];
EventRanking::setV($lastRankingMeta['wave'],$lastRankingMeta['themeType'],$cegNum);
}
error_log(json_encode(array(
'myAward' => $myAward,
'ranking' => 'BattleRanking',
'number'=>$myAward['rewardNum']+$myAward['extraRewardNum']
)));
$this->_rspOk();
};break;
default : {
error_log('运营活动不存在');
}
}
}
}
}
}