game2006api/webapp/controller/EventRankingController.class.php
2022-11-23 15:35:05 +08:00

444 lines
21 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
$awardList = array();
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;
array_push($awardList,array(
'ranked'=>$ranked,
'account_id'=>$row['account_id'],
'rewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'],
'extraRewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'],
));
}
if ($awardList){
//记录此活动的CEG奖励
foreach ($awardList as $value){
$cegNum = $value['rewardNum']+$value['extraRewardNum'];
EventRanking::setV($value['account_id'],$lastRankingMeta['wave'],$lastRankingMeta['themeType'],$cegNum);
}
}
error_log('********** KILL RANKING SETTLEMENT SUCCESS ***********');
$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;
array_push($awardList,array(
'ranked'=>$ranked,
'account_id'=>$row['account_id'],
'rewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'],
'extraRewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'],
));
}
if ($awardList){
//记录此活动的CEG奖励
foreach ($awardList as $value){
$cegNum = $value['rewardNum']+$value['extraRewardNum'];
EventRanking::setV($value['account_id'],$lastRankingMeta['wave'],$lastRankingMeta['themeType'],$cegNum);
}
}
error_log('********** WIN RANKING SETTLEMENT SUCCESS ***********');
$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;
array_push($awardList,array(
'ranked'=>$ranked,
'account_id'=>$row['account_id'],
'rewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'],
'extraRewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'],
));
}
if ($awardList){
//记录此活动的CEG奖励
foreach ($awardList as $value){
$cegNum = $value['rewardNum']+$value['extraRewardNum'];
EventRanking::setV($value['account_id'],$lastRankingMeta['wave'],$lastRankingMeta['themeType'],$cegNum);
}
}
error_log('********** BATTLE RANKING SETTLEMENT SUCCESS ***********');
$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;
foreach ($rows as $row) {
$ranked += 1;
array_push($awardList,array(
'ranked'=>$ranked,
'guild_id'=>$row['guild_id'],
'rewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['rewardNum'],
'extraRewardNum'=>$this->celAward($row['wave'],$row['type'],$ranked)['extraRewardNum'],
));
}
if ($awardList) {
//记录此活动的CEG奖励
foreach ($awardList as $value) {
$usersDb = User::getListByGuildId($value['guild_id']);
$guildDb = Guild::find($value['guild_id']);
if (!$guildDb) {
error_log('The Guild Does Not Exist : ' . $value['guild_id']);
continue;
}
if ($usersDb) {
foreach ($usersDb as $user) {
$thisValue = 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' => $user['account_id']
)
);
$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' => $value['guild_id']
)
);
if (!$thisValue || !$sumValue) {
error_log('该用户无贡献 : ' . $user['account_id'] . ' | 工会总收益有问题 ' . $value['guild_id'] );
continue;
}
$rewardNum = $thisValue[0]['value'] / $sumValue[0]['value'] * $value['rewardNum'];
$extraRewardNum = $guildDb['owner_id'] == $user['account_id'] ? $value['extraRewardNum'] : 0;
$cegNum = $rewardNum + $extraRewardNum;
EventRanking::setV($user['account_id'], $lastRankingMeta['wave'], $lastRankingMeta['themeType'], $cegNum);
error_log(json_encode(
array(
'account_id' => $user['account_id'],
'guild_id' => $value['guild_id'],
'value' => $thisValue[0]['value'],
'sum_value' => $sumValue[0]['value'],
'rewardNum' => $rewardNum,
'extraRewardNum' => $extraRewardNum,
'CEG' => $cegNum
)
));
}
}
}
}
error_log('********** GUILD RANKING SETTLEMENT SUCCESS ***********');
$this->_rspOk();
};break;
default : {
error_log('运营活动不存在');
}
}
}
}
}
}