This commit is contained in:
hujiabin 2022-10-28 11:44:42 +08:00
parent 2c9a26a113
commit 8d162f3917
6 changed files with 227 additions and 77 deletions

View File

@ -165,6 +165,7 @@ CREATE TABLE `t_hero` (
`chip_ids` varchar(100) NOT NULL DEFAULT '' COMMENT '已镶嵌的芯片idx组',
`skill_common` varchar(255) NOT NULL DEFAULT '100100|100120|100140|100160|100180|100200|100220|100240|100260|100280' COMMENT '通用技能',
`skill_points` int(11) NOT NULL DEFAULT '0' COMMENT '技能点',
`labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值',
PRIMARY KEY (`idx`),
UNIQUE KEY `token_id` (`token_id`),
KEY `account_id` (`account_id`)
@ -266,6 +267,7 @@ CREATE TABLE `t_chip` (
`strength` varchar(10) NOT NULL DEFAULT '0' COMMENT '前一天体力值',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值',
PRIMARY KEY (`idx`),
UNIQUE KEY `token_id` (`token_id`),
KEY `item_id` (`item_id`),
@ -303,6 +305,7 @@ CREATE TABLE `t_gun` (
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`chip_ids` varchar(100) NOT NULL DEFAULT '' COMMENT '已镶嵌的芯片idx组',
`labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值',
PRIMARY KEY (`idx`),
UNIQUE KEY `token_id` (`token_id`),
KEY `account_id` (`account_id`)

View File

@ -25,18 +25,17 @@ class SeasonController extends BaseAuthedController {
private $propertyChgService = null;
private $awardService = null;
private $userInfo = null;
private $seasonService = null;
private $currSeasonMeta = null;
private $currRankSeasonMeta = null;
private $seasonDb = null;
private $missionService = null;
private $rankingUnid = 'game_2006_rank';
private $TopXunid = 'echelon_TopX_';
private $starshine = 2800;
public function _handlePre()
{
parent::_handlePre();
$this->currRankSeasonMeta = mt\RankSeason::getCurrentSeason();
// $this->currSeasonMeta = mt\Season::getCurrentSeason();
if (!$this->currRankSeasonMeta) {
$this->_rspErr(10, 'server internal error');
die();
@ -44,11 +43,6 @@ class SeasonController extends BaseAuthedController {
$this->propertyChgService = new services\PropertyChgService();
$this->awardService = new services\AwardService();
$this->userInfo = $this->_safeGetOrmUserInfo();
// $this->seasonService = new services\SeasonService();
// if (!$this->seasonService->checkSeason($this->userInfo)) {
// $this->userInfo = $this->_safeGetOrmUserInfo();
// $this->propertyChgService->addUserChg();
// }
$this->seasonDb = Season::find($this->currRankSeasonMeta['id']);
if (!$this->seasonDb) {
Season::add($this->currRankSeasonMeta['id']);
@ -79,7 +73,11 @@ class SeasonController extends BaseAuthedController {
public function infoNew()
{
// $r = $this->_getRedis($this->TopXunid.'4');
// $TopX_List = $this->readRankingList($r,$this->TopXunid.'5');
// $XX = $TopX_List ? $TopX_List[0]["rank_sort"]:10001;
// print_r($XX);
// die;
$rankMeta = mt\Rank::getRankById($this->userInfo['rank']);
$nextRankMeta = mt\Rank::getNextRankById($this->userInfo['rank']);
if (!$nextRankMeta){
@ -99,31 +97,7 @@ class SeasonController extends BaseAuthedController {
$rankList = $this->readRankingList($r,$this->rankingUnid);
$list = array();
if (!$rankList){
$users = User::orderBy(User::allUser());
$rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward');
$rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : '';
$rewardList = explode('|',$rewardParamMetaValue);
if (count($users)>0){
foreach ($users as $k=>$user){
$userDto = User::getUserByRankMess($user);
$userDto['rank_sort'] = $k+1;
switch ($userDto['rank_sort']){
case 1:$userDto['ring_item_id'] = $rewardList[0];break;
case 2:$userDto['ring_item_id'] = $rewardList[1];break;
case 3:$userDto['ring_item_id'] = $rewardList[2];break;
default : $userDto['ring_item_id'] = 0;
}
array_push($rankList,$userDto);
}
foreach ($rankList as $k=>$value){
if ($value['rank_sort'] <= 200){
$cec = 999;
$rankList[$k]['rewardCEC'] = $cec;
}else{
$rankList[$k]['rewardCEC'] = 0;
}
}
}
$rankList = $this->checkRankingList();
$this->saveRankingList($r,$this->rankingUnid,$rankList);
}
foreach ($rankList as $v){
@ -131,20 +105,8 @@ class SeasonController extends BaseAuthedController {
array_push($list,$v);
}
}
// $users = User::orderBy(User::getUserByRank($this->userInfo['rank']));
// $season_rank = array();
// if (count($users)>0){
// foreach ($users as $k=>$user){
// if ($k<20){
// $userDto = User::getUserByRankMess($user);
// $userDto['rank_sort'] = $k+1;
// array_push($season_rank,$userDto);
// }
// }
// }
$info['season_rank'] = $list;
$info['season_rank'] = $rankList;
$this->_rspData(['info'=>$info]);
// print_r($info);
}
public function getRankingInfo(){
@ -157,31 +119,7 @@ class SeasonController extends BaseAuthedController {
$rankList = $this->readRankingList($r,$this->rankingUnid);
$list = array();
if (!$rankList){
$users = User::orderBy(User::allUser());
$rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward');
$rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : '';
$rewardList = explode('|',$rewardParamMetaValue);
if (count($users)>0){
foreach ($users as $k=>$user){
$userDto = User::getUserByRankMess($user);
$userDto['rank_sort'] = $k+1;
switch ($userDto['rank_sort']){
case 1:$userDto['ring_item_id'] = $rewardList[0];break;
case 2:$userDto['ring_item_id'] = $rewardList[1];break;
case 3:$userDto['ring_item_id'] = $rewardList[2];break;
default : $userDto['ring_item_id'] = 0;
}
array_push($rankList,$userDto);
}
foreach ($rankList as $k=>$value){
if ($value['rank_sort'] <= 200){
$cec = 999;
$rankList[$k]['rewardCEC'] = $cec;
}else{
$rankList[$k]['rewardCEC'] = 0;
}
}
}
$rankList = $this->checkRankingList();
$this->saveRankingList($r,$this->rankingUnid,$rankList);
}
@ -325,6 +263,129 @@ class SeasonController extends BaseAuthedController {
return $info;
}
private function checkRankingList(){
$rankList = array();
$users = User::orderBy(User::allUser());
$rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward');
$rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : '';
$rewardList = explode('|',$rewardParamMetaValue);
if (count($users)>0){
$KingCount = 0;
foreach ($users as $k=>$user){
$userDto = User::getUserByRankMess($user);
$userDto['rank_sort'] = $k+1;
if ($userDto['score'] >= $this->starshine){
$KingCount += 1;
$userDto['echelonTopX'] = $this->echelonTopX($userDto['rank_sort']);
$r = $this->_getRedis($this->TopXunid.$userDto['echelonTopX']);
$TopX_List = $this->readRankingList($r,$this->TopXunid.$userDto['echelonTopX']);
array_push($TopX_List,$userDto);
$this->saveRankingList($r,$this->TopXunid.$userDto['echelonTopX'],$TopX_List);
}
switch ($userDto['rank_sort']){
case 1:$userDto['ring_item_id'] = $rewardList[0];break;
case 2:$userDto['ring_item_id'] = $rewardList[1];break;
case 3:$userDto['ring_item_id'] = $rewardList[2];break;
default : $userDto['ring_item_id'] = 0;
}
array_push($rankList,$userDto);
}
//当月排位赛最大分配金额
$maxSum = $this->calcCECMaxSum();
//排位赛参与分配人数
// $PeopleCapita = $this->calcPeopleCapita($KingCount);
//排位赛人数%
// $PeopleCapitaPer = $this->calcPeopleCapitaPer($KingCount);
//排位赛预计分配额
$expected_CEC_Sum = 0;
foreach ($rankList as $k=>$value){
$r = $this->_getRedis($this->TopXunid.($value['echelonTopX']+1));
$TopX_List = $this->readRankingList($r,$this->TopXunid.($value['echelonTopX']+1));
$XX = $TopX_List ? $TopX_List[0]["rank_sort"]:10001;
$rankList[$k]['standardTopX'] = $this->standardTopX($value['rank_sort'],$XX);
$expected_CEC_Sum += $this->calcCECTopXSum($value['rank_sort'],$KingCount,$XX);
}
//排位赛金额%
$rankAmountPre = min($maxSum/($expected_CEC_Sum+1),1); //MIN(当月排位赛最大分配额/(排位赛预计分配额+1),1)
foreach ($rankList as $k=>$value){
// $rankList[$k]['rewardCEC'] = $value['standardTopX']*$rankAmountPre;
if ($value['score'] >= $this->starshine){
$rankList[$k]['rewardCEC'] = $value['standardTopX']*$rankAmountPre;
}else{
$rankList[$k]['rewardCEC'] = 0;
}
}
}
return $rankList;
}
//排位赛最大分配金额
private function calcCECMaxSum(){
//当月排位赛最大分配金额=ROUND(40000000/(12*(1+0.7^1+0.7^2+0.7^3+0.7^4+0.7^5+0.7^6+0.7^7))*0.7^(CEILING(月份数/12-0.01,1)-1),0)*70%
$month = date('m',$this->_getNowTime());
return round(40000000/(12*(1+pow(0.7,1)+pow(0.7,2)+pow(0.7,3)+pow(0.7,4)
+pow(0.7,5)+pow(0.7,6)+pow(0.7,7)))*pow(0.7,ceil($month/12-0.01)-1),0)*0.7;
}
//排位赛参与分配人数
private function calcPeopleCapita($kingCount){
//MIN(当月王者及以上用户数ROUND(LOG10(当月王者及以上用户数+2)^3*1.5,1)*100)
return min($kingCount,round(pow(log10($kingCount+2),3)*1.5,1)*100);
}
//排位赛人数%
private function calcPeopleCapitaPer($kingCount){
//MIN(ROUND(0.31*MIN(当月王者及以上用户数,ROUND(LOG10(当月王者及以上用户数+1)^3*1.5,2)*100)^0.226,2),2)
return min(round(0.31*pow(min($kingCount,round(pow(log10($kingCount+1),3)*1.5,2)*100),0.226),2),2);
}
//TopX梯队
private function echelonTopX($top){
//TopX梯队=SIGN(TopX<=3)*1+SIGN(TopX>3)*SIGN(TopX<=10)*2+SIGN(TopX>10)*SIGN(TopX<=50)*3
//+SIGN(TopX>50)*SIGN(TopX<=100)*4+SIGN(TopX>100)*SIGN(TopX<=500)*5+SIGN(TopX>500)*SIGN(TopX<=1000)*6
//+SIGN(TopX>1000)*SIGN(TopX<=2000)*7+SIGN(TopX>2000)*SIGN(TopX<=5000)*8
//+SIGN(TopX>5000)*SIGN(TopX<=10000)*9+SIGN(TopX>10000)*10
return ($top<=3?1:0)*1+($top>3?1:0)*($top<=10?1:0)*2+($top>10?1:0)*($top<=50?1:0)*3
+($top>50?1:0)*($top<=100?1:0)*4+($top>100?1:0)*($top<=500?1:0)*5+($top>500?1:0)*($top<=1000?1:0)*6
+($top>1000?1:0)*($top<=2000?1:0)*7+($top>2000?1:0)*($top<=5000?1:0)*8
+($top>5000?1:0)*($top<=10000?1:0)*9+($top>10000?1:0)*10;
}
//TopX开始值
private function startTopX($top){
//TopX开始值=SIGN(TopX梯队=1)*1+SIGN(TopX梯队=2)*4+SIGN(TopX梯队=3)*11+SIGN(TopX梯队=4)*51
//+SIGN(TopX梯队=5)*101+SIGN(TopX梯队=6)*501+SIGN(TopX梯队=7)*1001
//+SIGN(TopX梯队=8)*2001+SIGN(TopX梯队=9)*5001+SIGN(TopX梯队=10)*10001
return ($this->echelonTopX($top)==1?1:0)*1+($this->echelonTopX($top)==2?1:0)*4+($this->echelonTopX($top)==3?1:0)*11+($this->echelonTopX($top)==4?1:0)*51
+($this->echelonTopX($top)==5?1:0)*101+($this->echelonTopX($top)==6?1:0)*501+($this->echelonTopX($top)==7?1:0)*1001
+($this->echelonTopX($top)==8?1:0)*2001+($this->echelonTopX($top)==9?1:0)*5001+($this->echelonTopX($top)==10?1:0)*10001;
}
//TopX梯队最高值
private function maxTopX($top){
//TopX梯队最高值=ROUND(2000*0.6^(TopX梯队-1)*0.9^(TopX梯队-1),0)
return round(2000*pow(0.6,$this->echelonTopX($top)-1)*pow(0.9,$this->echelonTopX($top)-1),0);
}
//TopX梯队最低值
private function minTopX($top){
//TopX梯队最低值=ROUND(2000*0.6^(TopX梯队)*0.9^(TopX梯队-1),0)
return round(2000*pow(0.6,$this->echelonTopX($top))*pow(0.9,$this->echelonTopX($top)-1),0);
}
//TopX排位赛标准分配额
private function standardTopX($top,$XX){
//TopX排位赛标准分配额=MAX(ROUND(TopX梯队最高值-(TopX梯队最高值-TopX梯队最低值)/(TopX梯队开始值(TopX梯队+1)-TopX梯队开始值-1)*(TopX-TopX梯队开始值),2),TopX梯队最低值)
return max(round($this->maxTopX($top)-($this->maxTopX($top)-$this->minTopX($top))/($XX-$this->startTopX($top)-1)*($top-$this->startTopX($top)),2),$this->minTopX($top));
}
//TopX排位赛预计分配额
private function calcCECTopXSum($top,$kingCount,$XX){
//TopX排位赛标准分配额*排位赛人数%
return $this->standardTopX($top,$XX)*$this->calcPeopleCapitaPer($kingCount);
}
//排位赛金额%
private function rankAmountPre(){
//MIN(当月排位赛最大分配额/(排位赛预计分配额+1),1)
}
private function readRankingList($r,$rankUnid)
{
$list = $r->get(RANKING_KEY.$rankUnid);

View File

@ -10,6 +10,7 @@ require_once('mt/Item.php');
require_once('mt/SkillCommon.php');
require_once('models/HeroSkin.php');
require_once('models/Chip.php');
require_once('models/User.php');
require_once('services/NftService.php');
require_once('services/FormulaService.php');
@ -21,6 +22,7 @@ use services\NftService;
use services\FormulaService;
class Hero extends BaseModel {
const GETED_STATE = 0;
@ -116,6 +118,7 @@ class Hero extends BaseModel {
'token_id' => $nftDb['token_id'],
)
);
User::upsertHeadList($itemMeta);
}
}
if ($row) {
@ -272,7 +275,6 @@ class Hero extends BaseModel {
}
if ($tokenId) {
$fieldsKv['token_id'] = $tokenId;
User::upsertHeadList($heroMeta);
}
SqlHelper::insert(

View File

@ -1,10 +1,33 @@
<?php
namespace models;
class SeasonHistory
{
use mt;
use phpcommon\SqlHelper;
class SeasonHistory extends BaseModel
{
public static function save($data){
SqlHelper::upsert(
myself()->_getSelfMysql(),
't_season_history',
array(
'account_id' => myself()->_getAccountId(),
'season' => $data['season'],
),
array(),
$data
);
}
public static function getDataBySeasonId($seasonId){
return SqlHelper::ormSelect(
myself()->_getSelfMysql(),
't_season_history',
array(
'season' => $seasonId,
)
);
}
}

View File

@ -3,8 +3,10 @@
namespace models;
use mt;
use phpcommon\SqlHelper;
class UserSeasonRing
class UserSeasonRing extends BaseModel
{
}

View File

@ -788,4 +788,63 @@ class FormulaService extends BaseService {
return min($bceg,$bceg_max)*$param*self::CEG_Dynamic_Price();
}
//排位赛最大分配金额
public static function calcCECMaxSum(){
//当月排位赛最大分配金额=ROUND(40000000/(12*(1+0.7^1+0.7^2+0.7^3+0.7^4+0.7^5+0.7^6+0.7^7))*0.7^(CEILING(月份数/12-0.01,1)-1),0)*70%
$month = date('m',myself()->_getNowTime());
return round(40000000/(12*(1+pow(0.7,1)+pow(0.7,2)+pow(0.7,3)+pow(0.7,4)
+pow(0.7,5)+pow(0.7,6)+pow(0.7,7)))*pow(0.7,ceil($month/12-0.01)-1),0)*0.7;
}
//排位赛参与分配人数
private function calcPeopleCapita($kingCount){
//MIN(当月王者及以上用户数ROUND(LOG10(当月王者及以上用户数+2)^3*1.5,1)*100)
return min($kingCount,round(pow(log10($kingCount+2),3)*1.5,1)*100);
}
//排位赛人数%
private static function calcPeopleCapitaPer($kingCount){
//MIN(ROUND(0.31*MIN(当月王者及以上用户数,ROUND(LOG10(当月王者及以上用户数+1)^3*1.5,2)*100)^0.226,2),2)
return min(round(0.31*pow(min($kingCount,round(pow(log10($kingCount+1),3)*1.5,2)*100),0.226),2),2);
}
//TopX梯队
public static function echelonTopX($top){
//TopX梯队=SIGN(TopX<=3)*1+SIGN(TopX>3)*SIGN(TopX<=10)*2+SIGN(TopX>10)*SIGN(TopX<=50)*3
//+SIGN(TopX>50)*SIGN(TopX<=100)*4+SIGN(TopX>100)*SIGN(TopX<=500)*5+SIGN(TopX>500)*SIGN(TopX<=1000)*6
//+SIGN(TopX>1000)*SIGN(TopX<=2000)*7+SIGN(TopX>2000)*SIGN(TopX<=5000)*8
//+SIGN(TopX>5000)*SIGN(TopX<=10000)*9+SIGN(TopX>10000)*10
return ($top<=3?1:0)*1+($top>3?1:0)*($top<=10?1:0)*2+($top>10?1:0)*($top<=50?1:0)*3
+($top>50?1:0)*($top<=100?1:0)*4+($top>100?1:0)*($top<=500?1:0)*5+($top>500?1:0)*($top<=1000?1:0)*6
+($top>1000?1:0)*($top<=2000?1:0)*7+($top>2000?1:0)*($top<=5000?1:0)*8
+($top>5000?1:0)*($top<=10000?1:0)*9+($top>10000?1:0)*10;
}
//TopX开始值
private static function startTopX($top){
//TopX开始值=SIGN(TopX梯队=1)*1+SIGN(TopX梯队=2)*4+SIGN(TopX梯队=3)*11+SIGN(TopX梯队=4)*51
//+SIGN(TopX梯队=5)*101+SIGN(TopX梯队=6)*501+SIGN(TopX梯队=7)*1001
//+SIGN(TopX梯队=8)*2001+SIGN(TopX梯队=9)*5001+SIGN(TopX梯队=10)*10001
return (self::echelonTopX($top)==1?1:0)*1+(self::echelonTopX($top)==2?1:0)*4+(self::echelonTopX($top)==3?1:0)*11+(self::echelonTopX($top)==4?1:0)*51
+(self::echelonTopX($top)==5?1:0)*101+(self::echelonTopX($top)==6?1:0)*501+(self::echelonTopX($top)==7?1:0)*1001
+(self::echelonTopX($top)==8?1:0)*2001+(self::echelonTopX($top)==9?1:0)*5001+(self::echelonTopX($top)==10?1:0)*10001;
}
//TopX梯队最高值
private static function maxTopX($top){
//TopX梯队最高值=ROUND(2000*0.6^(TopX梯队-1)*0.9^(TopX梯队-1),0)
return round(2000*pow(0.6,self::echelonTopX($top)-1)*pow(0.9,self::echelonTopX($top)-1),0);
}
//TopX梯队最低值
private static function minTopX($top){
//TopX梯队最低值=ROUND(2000*0.6^(TopX梯队)*0.9^(TopX梯队-1),0)
return round(2000*pow(0.6,self::echelonTopX($top))*pow(0.9,self::echelonTopX($top)-1),0);
}
//TopX排位赛标准分配额
public static function standardTopX($top,$XX){
//TopX排位赛标准分配额=MAX(ROUND(TopX梯队最高值-(TopX梯队最高值-TopX梯队最低值)/(TopX梯队开始值(TopX梯队+1)-TopX梯队开始值-1)*(TopX-TopX梯队开始值),2),TopX梯队最低值)
return max(round(self::maxTopX($top)-(self::maxTopX($top)-self::minTopX($top))/($XX-self::startTopX($top)-1)*($top-self::startTopX($top)),2),self::minTopX($top));
}
//TopX排位赛预计分配额
public static function calcCECTopXSum($top,$kingCount,$XX){
//TopX排位赛标准分配额*排位赛人数%
return self::standardTopX($top,$XX)*self::calcPeopleCapitaPer($kingCount);
}
}