diff --git a/doc/EventRanking.py b/doc/EventRanking.py new file mode 100644 index 00000000..0939c34f --- /dev/null +++ b/doc/EventRanking.py @@ -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()], '活动列表'], + ] + }, + + ] diff --git a/doc/_common.py b/doc/_common.py index f9e440d7..3ee6be34 100644 --- a/doc/_common.py +++ b/doc/_common.py @@ -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:等待中'], + ] diff --git a/sql/gamedb.sql b/sql/gamedb.sql index 1f4c0e2d..791fdef3 100644 --- a/sql/gamedb.sql +++ b/sql/gamedb.sql @@ -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 */; diff --git a/webapp/controller/EventRankingController.class.php b/webapp/controller/EventRankingController.class.php new file mode 100644 index 00000000..93438e41 --- /dev/null +++ b/webapp/controller/EventRankingController.class.php @@ -0,0 +1,264 @@ +_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 + ); + } + + +} \ No newline at end of file diff --git a/webapp/mt/EventRanking.php b/webapp/mt/EventRanking.php new file mode 100644 index 00000000..8714b382 --- /dev/null +++ b/webapp/mt/EventRanking.php @@ -0,0 +1,68 @@ +_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; + +} \ No newline at end of file diff --git a/webapp/services/BattleDataService.php b/webapp/services/BattleDataService.php index d325f814..f6fbd8ee 100644 --- a/webapp/services/BattleDataService.php +++ b/webapp/services/BattleDataService.php @@ -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) { diff --git a/webapp/services/RankActivityService.php b/webapp/services/RankActivityService.php index 78667b79..c12eaafd 100644 --- a/webapp/services/RankActivityService.php +++ b/webapp/services/RankActivityService.php @@ -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() +// ) +// ); +// } + }