This commit is contained in:
hujiabin 2024-09-19 15:56:26 +08:00
parent 13d0ce42be
commit c47af32a59
5 changed files with 156 additions and 3 deletions

View File

@ -18,6 +18,19 @@ class Circuit(object):
_common.RspHead(),
['!info', [stageInfo()], '巡回赛当前阶段信息'],
]
},{
'name': 'getCircuitRanking',
'desc': '巡回赛排行',
'group': 'Circuit',
'url': 'webapp/index.php?c=Circuit&a=getCircuitRanking',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
['!rank_list', [rankingInfo()], '榜信息'],
['my_rank', rankingInfo(), '我的信息'],
]
}
]
@ -30,6 +43,18 @@ class stageInfo(object):
self.fields = [
['start_time', 0, '开始时间'],
['end_time', 0, '结束时间'],
['cec_pool', 0, '当前阶段奖池'],
['stage_cec_pool', 0, '当前阶段奖池'],
['total_cec_pool', 0, '赛季总奖池'],
]
class rankingInfo(object):
def __init__(self):
self.fields = [
['account_id', 0, 'account'],
['name', 0, '名字'],
['head_id', 0, '头像'],
['head_frame', 0, '头像框'],
['ranking', 0, '排名'],
['score', 0, '积分'],
]

View File

@ -2,6 +2,7 @@
define('TEAMID_KEY', 'team_uuid:');
define('RANKING_KEY', 'game2006api:');
define('CIRCUIT_RANKING_KEY', 'game2006api:circuit_ranking');
define('DAILY_SELECTION_KEY', 'game2006api:daily_selection:');
define('PLANET_BUY_KEY', 'game2006api:planet_buy:');

View File

@ -1,21 +1,30 @@
<?php
require_once('mt/Parameter.php');
require_once('mt/CircuitTime.php');
require_once('mt/CircuitReward.php');
require_once('models/Circuit.php');
require_once('models/User.php');
use models\Circuit;
use models\User;
use phpcommon\SqlHelper;
class CircuitController extends BaseAuthedController {
private $redis_key_circuit_ranking = 'circuit_ranking';
public function getCurrentStage(){
$circuitStageMeta = mt\CircuitTime::getCurrentStage();
if (!$circuitStageMeta){
$this->_rspErr(1, 'current stage Have not yet started');
return ;
}
$currentCircuitMeta = mt\CircuitTime::getCurrentCircuit();
$info = array(
'start_time' => strtotime($circuitStageMeta['start_time']),
'end_time' => strtotime($circuitStageMeta['end_time']),
'cec_pool' => $circuitStageMeta['cec_pool']
'stage_cec_pool' => $circuitStageMeta['cec_pool'],
'total_cec_pool' => $currentCircuitMeta['cec_pool']
);
$this->_rspData(array('info' => $info));
}
@ -26,5 +35,82 @@ class CircuitController extends BaseAuthedController {
$this->_rspErr(1, 'current stage Have not yet started');
return ;
}
$redis = $this->_getRedis($this->redis_key_circuit_ranking);
if (! $redis->exists(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking)){
$rows = Circuit::getRankingList($currentCircuitMeta['circuit_season']);
$list = $this->_extractRankingInfo($rows);
$redis->set(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking , json_encode($list));
$redis->pexpire(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking , 10*60*1000);
}else{
$listStr = $redis->get(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking);
$list = emptyReplace(json_decode($listStr, true), array());
}
$myRankedInfo = $this->_celMyRankingInfo($list);
$this->_rspData(array(
'rank_list' => $list,
'my_rank' => $myRankedInfo,
));
}
private function _extractRankingInfo($data){
$rankingList = array();
foreach ($data as $k=>$row){
$userDb = User::find($row['account_id']);
$ranking = $k+1;
$rewardWeight = \mt\CircuitReward::getRewardWeight($ranking);
if ($userDb){
$info = array(
'account_id' => $userDb['account_id'],
'name' => utf8_encode($userDb['name']),
'head_id' => $userDb['head_id'],
'head_frame' => $userDb['head_frame'],
'ranking' => $ranking,
'weight' => $rewardWeight,
'score' => $row['cumulative_score'],
);
array_push($rankingList,$info);
}
}
return $rankingList;
}
private function _celMyRankingInfo($list){
$currentCircuitMeta = mt\CircuitTime::getCurrentCircuit();
$userDb = User::find(myself()->_getAccountId());
$myRankedInfo = array(
'ranking' => 0,
'account_id' => $userDb['account_id'],
'name' => $userDb['name'],
'head_id' => $userDb['head_id'],
'head_frame' => $userDb['head_frame'],
'score' => Circuit::getMyScore($currentCircuitMeta['circuit_season']),
'cec' => 0,
);
if (count($list) > 0){
$totalWeight = 0;
$rate = \mt\Parameter::getVal('circuit_reward_rate','');
$count = floor(count($list) * $rate) ;
foreach ($list as $value){
if ($value['ranking'] <= $count){
$totalWeight += $value['weight'];
}
}
$circuitStageMeta = mt\CircuitTime::getCurrentStage();
$cecPool = $circuitStageMeta ? $circuitStageMeta['cec_pool'] : 0;
foreach ($list as $value){
$cec = 0;
if ($value['ranking'] <= $count){
$cec = ($value['weight'] / $totalWeight) * $cecPool;
}
if ($value['account_id'] == myself()->_getAccountId()){
$myRankedInfo['ranking'] = $value['ranking'];
$myRankedInfo['cec'] = $cec;
}
}
}
return $myRankedInfo;
}
}

View File

@ -31,7 +31,7 @@ class Circuit extends BaseModel
public static function getMyScore($season){
$row = SqlHelper::ormSelectOne(
myself()->_getMysql(''),
myself()->_getSelfMysql(),
't_circuit_battle',
array(
'account_id' => myself()->_getAccountId(),
@ -41,4 +41,16 @@ class Circuit extends BaseModel
return $row ? $row['cumulative_score'] : 0;
}
public static function getRankingList($season){
$sql = "select * from t_circuit_battle where season=:season order by cumulative_score desc,modifytime asc";
$whereKv = array(
"season" => $season,
);
$rows = myself()->_getSelfMysql()->execQuery($sql,$whereKv);
if (!$rows){
$rows = array();
}
return $rows;
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace mt;
use phpcommon;
class CircuitReward {
public static function getRewardWeight($ranking){
$rewardWeight = 0;
foreach (self::getMetaList() as $meta){
if ($ranking >= $meta['rankMin']){
$rewardWeight = $meta['rewardWeight'];
}
}
return $rewardWeight;
}
protected static function getMetaList()
{
if (!self::$metaList) {
self::$metaList = getMetaTable('circuitReward@circuitReward.php');
}
return self::$metaList;
}
protected static $metaList;
}