548 lines
25 KiB
PHP
548 lines
25 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;
|
||
use phpcommon\SqlHelper;
|
||
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
|
||
)
|
||
);
|
||
|
||
$this->myRanked['value'] = $this->getMyValue($wave,$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
|
||
)
|
||
);
|
||
$this->myRanked['value'] = $this->getMyValue($wave,$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
|
||
)
|
||
);
|
||
$this->myRanked['value'] = $this->getMyValue($wave,$type);
|
||
$data = $this->paginate($rows,$page,$size);
|
||
$pages = $data['pages'];
|
||
$rankingList = $data['lists'];
|
||
} break;
|
||
case \services\RankActivityService::GUILD_TYPE : {
|
||
$this->myRanked['test_ceg'] = 0;
|
||
$rankDb = SqlHelper::ormSelectOne
|
||
(myself()->_getSelfMysql(),
|
||
't_rank_activity',
|
||
array(
|
||
'account_id' => myself()->_getAccountId(),
|
||
'wave' => $wave,
|
||
'type' => $type,
|
||
)
|
||
);
|
||
if ($rankDb){
|
||
$this->myRanked['test_ceg'] = $rankDb['value'];
|
||
}
|
||
$rows = myself()->_getSelfMysql()->execQuery(
|
||
'SELECT guild_id,SUM(value) AS value FROM t_rank_activity ' .
|
||
'WHERE wave=:wave AND type=:type AND guild_id<>""' .
|
||
'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
|
||
);
|
||
|
||
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 getMyValue($wave,$type){
|
||
$value = myself()->_getSelfMysql()->execQuery(
|
||
'SELECT * FROM t_rank_activity ' .
|
||
'WHERE wave=:wave AND type=:type AND account_id=:account_id ' .
|
||
"LIMIT 1",
|
||
array(
|
||
':wave' => $wave,
|
||
':type' => $type,
|
||
':account_id' => myself()->_getAccountId()
|
||
)
|
||
);
|
||
return $value ? $value[0]['value'] : 0;
|
||
}
|
||
|
||
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(){
|
||
return
|
||
$id = getReqVal('id', 0);
|
||
// $currentRankingMeta = mt\EventRanking::getCurrentRanking();
|
||
$awardList = array();
|
||
// if ($currentRankingMeta){
|
||
$lastRankingMeta = mt\EventRanking::find($id);
|
||
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('运营活动不存在');
|
||
}
|
||
}
|
||
}
|
||
// }
|
||
}
|
||
|
||
public function updateWinsData(){
|
||
return
|
||
$rows = myself()->_getSelfMysql()->execQuery(
|
||
'SELECT * FROM t_rank_activity ' .
|
||
'WHERE wave=:wave AND type=:type ',
|
||
array(
|
||
':wave' => 1,
|
||
':type' => 2
|
||
)
|
||
);
|
||
foreach ($rows as &$row){
|
||
$battle_record = myself()->_getSelfMysql()->execQuery(
|
||
'SELECT * FROM t_battle_record ' .
|
||
'WHERE account_id=:account_id AND createtime>:createtime1 AND createtime<:createtime2 ',
|
||
array(
|
||
':account_id' => $row['account_id'],
|
||
':createtime1' => 1669896000,
|
||
':createtime2' => 1670500800,
|
||
)
|
||
);
|
||
foreach ($battle_record as $value){
|
||
$request = emptyReplace(json_decode($value['request'], true), array());
|
||
if ($request['ranked'] == 1 && $request['match_mode'] == 0){
|
||
$row['new_value']+=1;
|
||
}
|
||
}
|
||
}
|
||
foreach ($rows as $row){
|
||
SqlHelper::update
|
||
(myself()->_getSelfMysql(),
|
||
't_rank_activity',
|
||
array(
|
||
'account_id' => $row['account_id'],
|
||
'wave' => 1,
|
||
'type' => 2,
|
||
),
|
||
array(
|
||
'value'=>$row['new_value']?$row['new_value']:0
|
||
)
|
||
);
|
||
}
|
||
$this->_rspOk();
|
||
}
|
||
|
||
public function compensationWins(){
|
||
return
|
||
$rows = myself()->_getSelfMysql()->execQuery(
|
||
'SELECT * FROM t_rank_activity ' .
|
||
'WHERE wave=:wave AND type=:type ' .
|
||
'ORDER BY value DESC ',
|
||
array(
|
||
':wave' => 1,
|
||
':type' => 2
|
||
)
|
||
);
|
||
|
||
$compensationList= array();
|
||
$ranked = 0;
|
||
foreach ($rows as $row) {
|
||
$ranked += 1;
|
||
if ($ranked>10 && $row['value'] >0){
|
||
array_push($compensationList,array(
|
||
'ranked'=>$ranked,
|
||
'account_id'=>$row['account_id'],
|
||
'rewardNum'=>5,
|
||
'value'=>$row['value']
|
||
));
|
||
}
|
||
|
||
}
|
||
if ($compensationList){
|
||
//记录此活动的CEG奖励
|
||
foreach ($compensationList as $value){
|
||
$cegNum = $value['rewardNum'];
|
||
EventRanking::setV($value['account_id'],1,9999,$cegNum);
|
||
}
|
||
}
|
||
error_log('********** WIN RANKING COMPENSATION SUCCESS ***********');
|
||
$this->_rspOk();
|
||
}
|
||
}
|