ADD rangkingActivity

This commit is contained in:
hujiabin 2022-11-16 11:36:19 +08:00
parent 134ab6aeeb
commit ed2c029e8d
7 changed files with 526 additions and 78 deletions

23
doc/EventRanking.py Normal file
View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
import _common
class EventRanking(object):
def __init__(self):
self.apis = [
{
'name': 'eventRankingList',
'desc': '排行活动列表',
'group': 'History',
'url': 'webapp/index.php?c=Battle&a=eventRankingList',
'params': [
_common.ReqHead(),
],
'response': [
_common.RspHead(),
['!list', [_common.EventRankingList()], '活动列表'],
]
},
]

View File

@ -587,13 +587,16 @@ class RankingItemEx(object):
['ranked', 0, '排名'],
['user', UserSimple(), '用户信息'],
['value', 0, '存活时间 击杀数'],
['rewardNum', 0, '奖励'],
['extraRewardNum', 0, '额外奖励'],
]
class RankingListEx(object):
def __init__(self):
self.fields = [
['type', 0, '排行榜类型 1:存活时间 2:击杀数'],
['type', 0, '排行榜类型 1:击杀榜 2:吃鸡榜 3:场次榜 4:工会榜'],
['pages', 0, '总页数 0表示无需分页'],
['!rows', [RankingItemEx()], '排行榜'],
['my_ranked', RankingItemEx(), '我的排名(如果ranked<1则表示自己未上榜)'],
]
@ -974,3 +977,14 @@ class NftTransaction(object):
['time', 0, '时间'],
['status', 0, '1:已完成 2:等待中'],
]
class EventRankingList(object):
def __init__(self):
self.fields = [
['id', 0, 'id'],
['wave', 0, '活动轮数'],
['themeType', 0, '1 击杀榜,2 吃鸡榜,3 场次榜,4 工会榜'],
['themeName', '', '活动名称'],
['status', 0, '0:已结束 1:进行中 2:等待中'],
]

View File

@ -549,14 +549,17 @@ CREATE TABLE `t_rank_activity` (
`idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
`account_id` varchar(60) NOT NULL DEFAULT '' COMMENT '账号id',
`channel` int(11) NOT NULL DEFAULT '0' COMMENT 'channel',
`guild_id` varchar(60) NOT NULL DEFAULT '' COMMENT '工会id',
`wave` int(11) NOT NULL DEFAULT '0' COMMENT 'wave',
`type` int(11) NOT NULL DEFAULT '0' COMMENT 'type',
`value` bigint NOT NULL DEFAULT '0' COMMENT 'value',
`value` double NOT NULL DEFAULT '0' COMMENT 'value',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`),
UNIQUE KEY `account_id_type` (`account_id`, `type`),
UNIQUE KEY `account_id_wave_type` (`account_id`, `wave`, `type`),
KEY `channel` (`channel`),
KEY `type` (`type`),
KEY `guild_id` (`guild_id`),
KEY `value` (`value`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;

View File

@ -0,0 +1,264 @@
<?php
require_once('models/User.php');
require_once('mt/EventRanking.php');
require_once('services/RankActivityService.php');
use models\User;
class EventRankingController extends BaseAuthedController
{
public function eventRankingList(){
$this->_rspData(array(
'list' => mt\EventRanking::getEventRankingList()
));
}
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 1:{
$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'];
// $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'] == $myRanked['user']['account_id']) {
// $myRanked['ranked'] = $ranked;
// $myRanked['value'] = $row['value'];
// $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'],
// 'modifytime' => $row['modifytime'],
// ));
// }
// }
} break;
case 2:{
$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 3:{
$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'];
// $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'] == $myRanked['user']['account_id']) {
// $myRanked['ranked'] = $ranked;
// $myRanked['value'] = $row['value'];
// $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'],
// 'modifytime' => $row['modifytime'],
// ));
// }
// }
} break;
case 4:{
$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;
// print_r($userInfo);die;
foreach ($rows as $row) {
$ranked += 1;
if (!$userInfo['guild_id']){
$this->myRanked = array();
}else if($userInfo['guild_id'] && $userInfo['guild_id'] == $row['guild_id']){
$this->myRanked['ranked'] = $ranked;
$this->myRanked['user'] = $row['guild_id'];
$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'];
}else{
// $this->myRanked['value'] = $row['value'];
// $this->myRanked['user'] = $row['guild_id'];
}
array_push($rankingList, array(
'ranked' => $ranked,
'user' => $row['guild_id'],
'value' => $row['value'],
'rewardNum' => $this->celAward($wave,$type,$ranked)['rewardNum'],
'extraRewardNum' => $this->celAward($wave,$type,$ranked)['extraRewardNum'],
'modifytime' => $row['modifytime'],
));
}
} break;
}
$rankingData = array(
'type' => $type,
'pages' => $pages,
'rows' => $rankingList,
'my_ranked' => $this->myRanked
);
return $rankingData;
// print_r($rankingData);die;
}
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
);
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace mt;
class EventRanking
{
public static function findByWaveOrType($wave,$type){
$arr = array();
foreach (self::getMetaList() as $meta) {
if ($meta['wave'] == $wave && $meta['themeType'] == $type ){
$arr = $meta;
}
}
return $arr;
}
public static function getEventRankingList(){
$currentMeta = self::getCurrentRanking();
$wave = $currentMeta?$currentMeta['wave']:1;
$list = array();
foreach (self::getMetaList() as $meta) {
if ($meta['wave'] == $wave){
array_push($list,self::setState($meta));
}
}
return $list;
}
public static function getCurrentRanking()
{
foreach (self::getMetaList() as $meta) {
if (myself()->_getNowTime() >= strtotime($meta['startTime']) &&
myself()->_getNowTime() <= strtotime($meta['endTime'])) {
return $meta;
}
}
return null;
}
protected static function setState($meta){
$row = array(
'id' => $meta['id'],
'wave' => $meta['wave'],
'themeType' => $meta['themeType'],
'themeName' => $meta['themeName'],
);
$now = myself()->_getNowTime();
switch ($now){
case $now < strtotime($meta['startTime'] ) : $row['status'] = 2;break;
case $now >= strtotime($meta['startTime']) && $now <= strtotime($meta['endTime']) : $row['status'] = 1;break;
case $now >= strtotime($meta['endTime']) : $row['status'] = 0;break;
}
return $row;
}
protected static function getMetaList()
{
if (!self::$metaList) {
self::$metaList = getMetaTable('eventRanking@EventRanking.php');
}
return self::$metaList;
}
protected static $metaList;
}

View File

@ -555,8 +555,7 @@ class BattleDataService extends BaseService {
private function updatePvpData()
{
error_log('updateBattleData1');
$this->rankActivityService->updateBattleData();
error_log('updateBattleData2');
$hisBattleData = Battle::getMyBattleData();
if (!isset($hisBattleData)) {
@ -850,16 +849,15 @@ class BattleDataService extends BaseService {
'new_weaponPvpCeg2' => $weaponPvpCeg2,
)));
$gold = $heroPvpCeg + $weaponPvpCeg1 + $weaponPvpCeg2;
error_log('updateBattleData1');
$this->rankActivityService->updateBattleData($gold);
if ($heroPvpCeg>0){
// $this->_addNftActive($this->heroDto,1);
NftService::addNftActive($this->heroDto,1);
}
if ($weaponPvpCeg1>0){
// $this->_addNftActive($this->weapon1Dto,2);
NftService::addNftActive($this->weapon1Dto,2);
}
if ($weaponPvpCeg2>0){
// $this->_addNftActive($this->weapon2Dto,2);
NftService::addNftActive($this->weapon2Dto,2);
}
if ($gold > 0) {
@ -1018,16 +1016,15 @@ class BattleDataService extends BaseService {
'new_weaponPveCeg2' => $weaponPveCeg2,
)));
$gold = $heroPveCeg + $weaponPveCeg1 + $weaponPveCeg2;
error_log('updateBattleData1');
$this->rankActivityService->updateBattleData($gold);
if ($heroPveCeg>0){
// $this->_addNftActive($this->heroDto,1);
NftService::addNftActive($this->heroDto,1);
}
if ($weaponPveCeg1>0){
// $this->_addNftActive($this->weapon1Dto,2);
NftService::addNftActive($this->weapon1Dto,2);
}
if ($weaponPveCeg2>0){
// $this->_addNftActive($this->weapon2Dto,2);
NftService::addNftActive($this->weapon2Dto,2);
}
if ($gold > 0) {

View File

@ -12,6 +12,7 @@ require_once('mt/Parameter.php');
require_once('mt/HeroQuality.php');
require_once('mt/AttrHelper.php');
require_once('mt/RankActivity.php');
require_once('mt/EventRanking.php');
require_once('models/Season.php');
require_once('models/Battle.php');
@ -30,81 +31,159 @@ use models\Gun;
class RankActivityService extends BaseService {
const ALIVE_TYPE = 1;
const KILLS_TYPE = 2;
const HERO_UPGRADE_LEVEL_TYPE = 3;
const HERO_UPGRADE_QUALITY_TYPE = 4;
const KILLS_TYPE = 1; //击杀榜
const WINS_TYPE = 2; //吃鸡榜
const BATTLES_TYPE = 3; //场次榜
const GUILD_TYPE = 4; //工会榜
const OP_SUM = 1;
const OP_GREATEST = 2;
public function updateBattleData()
public function updateBattleData($gold)
{
$this->internalUpdateRankActivity(
self::ALIVE_TYPE,
getReqVal('alive_time', 0) / 1000,
self::OP_SUM);
$this->internalUpdateRankActivity(
self::KILLS_TYPE,
getReqVal('kills', 0),
self::OP_SUM);
}
public function heroUpgradeQuality($quality)
{
$this->internalUpdateRankActivity(
self::HERO_UPGRADE_QUALITY_TYPE,
$quality,
self::OP_GREATEST);
}
public function heroUpgradeLevel($level)
{
$this->internalUpdateRankActivity(
self::HERO_UPGRADE_LEVEL_TYPE,
$level,
self::OP_GREATEST);
}
private function internalUpdateRankActivity($type, $val, $opt)
{
$meta = mt\RankActivity::get($type);
if (!$meta || !mt\RankActivity::isActivityPeriod($meta)) {
if (SERVER_ENV != _ONLINE && myself()->_getChannel() == TAPTAP_CHANNEL) {
error_log('————————————游客无法参与排行活动——————————————');
return;
}
if ($val > $meta['limit']) {
$val = $meta['limit'];
$userDb = myself()->_getOrmUserInfo();
$currentRankingMeta = mt\EventRanking::getCurrentRanking();
if ($currentRankingMeta){
switch ($currentRankingMeta['themeType']){
case self::KILLS_TYPE :
{
$this->internalUpdateRankActivityNew(
$currentRankingMeta,
getReqVal('kills', 0),
$userDb);
}
break;
case self::WINS_TYPE :
{
$ranked = getReqVal('ranked', 0);
if ($ranked == 1){
$this->internalUpdateRankActivityNew(
$currentRankingMeta,
$ranked,
$userDb);
}
}
break;
case self::BATTLES_TYPE :
{
$this->internalUpdateRankActivityNew(
$currentRankingMeta,
1,
$userDb);
}
break;
case self::GUILD_TYPE :
{
if ($userDb['guild_id']){
$this->internalUpdateRankActivityNew(
$currentRankingMeta,
$gold,
$userDb);
}
}
break;
}
}
SqlHelper::upsert
(myself()->_getSelfMysql(),
't_rank_activity',
array(
'account_id' => myself()->_getAccountId(),
'type' => $type
),
array(
'value' => function () use($val, $opt) {
if ($opt == self::OP_SUM) {
return "value + ${val}";
} else if ($opt == self::OP_GREATEST) {
return "GREATEST(value, ${val})";
} else {
return $val;
}
},
'modifytime' => myself()->_getNowTime(),
),
array(
'account_id' => myself()->_getAccountId(),
'channel' => myself()->_getChannel(),
'type' => $type,
'value' => $val,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
)
);
// $this->internalUpdateRankActivity(
// self::ALIVE_TYPE,
// getReqVal('alive_time', 0) / 1000,
// self::OP_SUM);
// $this->internalUpdateRankActivity(
// self::KILLS_TYPE,
// getReqVal('kills', 0),
// self::OP_SUM);
}
private function internalUpdateRankActivityNew($meta, $val, $user){
if (!$meta){
return;
}
SqlHelper::upsert
(myself()->_getSelfMysql(),
't_rank_activity',
array(
'account_id' => myself()->_getAccountId(),
'wave' => $meta['wave'],
'type' => $meta['themeType'],
),
array(
'value' => function () use($val) {
return "value + ${val}";
},
'modifytime' => myself()->_getNowTime(),
),
array(
'account_id' => myself()->_getAccountId(),
'channel' => myself()->_getChannel(),
'guild_id'=>$user['guild_id'],
'wave' => $meta['wave'],
'type' => $meta['themeType'],
'value' => $val,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
)
);
}
// public function heroUpgradeQuality($quality)
// {
// $this->internalUpdateRankActivity(
// self::HERO_UPGRADE_QUALITY_TYPE,
// $quality,
// self::OP_GREATEST);
// }
//
// public function heroUpgradeLevel($level)
// {
// $this->internalUpdateRankActivity(
// self::HERO_UPGRADE_LEVEL_TYPE,
// $level,
// self::OP_GREATEST);
// }
// private function internalUpdateRankActivity($type, $val, $opt)
// {
// $meta = mt\RankActivity::get($type);
// if (!$meta || !mt\RankActivity::isActivityPeriod($meta)) {
// return;
// }
//
// if ($val > $meta['limit']) {
// $val = $meta['limit'];
// }
//
// SqlHelper::upsert
// (myself()->_getSelfMysql(),
// 't_rank_activity',
// array(
// 'account_id' => myself()->_getAccountId(),
// 'type' => $type
// ),
// array(
// 'value' => function () use($val, $opt) {
// if ($opt == self::OP_SUM) {
// return "value + ${val}";
// } else if ($opt == self::OP_GREATEST) {
// return "GREATEST(value, ${val})";
// } else {
// return $val;
// }
// },
// 'modifytime' => myself()->_getNowTime(),
// ),
// array(
// 'account_id' => myself()->_getAccountId(),
// 'channel' => myself()->_getChannel(),
// 'type' => $type,
// 'value' => $val,
// 'createtime' => myself()->_getNowTime(),
// 'modifytime' => myself()->_getNowTime()
// )
// );
// }
}