game2006api/webapp/controller/EventRankingController.class.php
hujiabin 66007b6e0f 1
2024-08-19 17:23:32 +08:00

548 lines
25 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;
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();
}
}