123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725 |
- <?php
- /**
- * Notes:推金币小游戏
- *
- * User: wsc
- * Time: 2020/11/18 14:16
- * Class ModelCoindozer
- */
- class ModelCoindozer{
- public $gameCfg =[
- "freeLimit"=>3,//免费次数
- "status"=>1,//状态
- "iosSet"=>[//ios设置
- "minVersion"=>'1.7.8',//最小开启版本
- "status"=>0 //开启状态
- ],
- "androidSet"=>[//安卓设置
- "minVersion"=>'1.7.0',
- "status"=>1
- ],
- "buyGameLimit"=>[
- "prize"=>20,//单价
- "maxNum"=>100,//最大次数
- ],
- "commonCfg"=>[ //常规用户
- "openLevel"=>8,//开放等级
- "freeExpLimit"=>1,//体验次数
- "expLevel"=>1, //体验等级
- "openExp"=>1, //是否开放渠道体验
- ],
- "specialCfg"=>[//广告渠道用户
- "openLevel"=>3,//开放等级
- "freeExpLimit"=>1,//体验次数
- "expLevel"=>1,//体验等级
- "openExp"=>1,//是否开放渠道体验
- ],
- "initTableModel"=>1,//初始化桌面的模式
- "buyGameProp"=>[//游戏道具价格
- "p1"=>["prize"=>20,"maxNum"=>100],
- "p2"=>["prize"=>40,"maxNum"=>100],
- ],
- ];
- //等级汇率 +
- public $exchangeRateCfg=[
- ["level"=>1,"er"=>1],
- ["level"=>2,"er"=>2],
- ["level"=>3,"er"=>3],
- ["level"=>4,"er"=>4],
- ["level"=>5,"er"=>5],
- ["level"=>6,"er"=>10],
- ];
- //掉落位置概率
- public $siteProbCfg=[
- ["id"=>1,"weight"=>10],
- ["id"=>2,"weight"=>10],
- ["id"=>3,"weight"=>10],
- ["id"=>4,"weight"=>9],
- ["id"=>5,"weight"=>15],
- ["id"=>6,"weight"=>8],
- ["id"=>7,"weight"=>15],
- ["id"=>8,"weight"=>8],
- ["id"=>9,"weight"=>2],
- ["id"=>10,"weight"=>8],
- ["id"=>11,"weight"=>2],
- ["id"=>12,"weight"=>1],
- ["id"=>13,"weight"=>2],
- ];
- //道具掉落规则 +
- public $propDropRule=[
- ["stage"=>100,"everyNum"=>10,"dropNum"=>1],
- ["stage"=>500,"everyNum"=>15,"dropNum"=>1],
- ["stage"=>2000,"everyNum"=>20,"dropNum"=>1],
- ["stage"=>10000,"everyNum"=>25,"dropNum"=>1],
- ["stage"=>100000000,"everyNum"=>30,"dropNum"=>1],
- ];
- //掉落道具概率 +
- public $propProbCfg=[
- ["id"=>1,"weight"=>360,"type"=>14,"rtype"=>2,"snum"=>2,"enum"=>10],
- ["id"=>2,"weight"=>120,"type"=>14,"rtype"=>2,"snum"=>11,"enum"=>30],
- ["id"=>3,"weight"=>40,"type"=>14,"rtype"=>2,"snum"=>31,"enum"=>60],
- ["id"=>4,"weight"=>10,"type"=>14,"rtype"=>2,"snum"=>61,"enum"=>100],
- ["id"=>5,"weight"=>220,"type"=>15,"rtype"=>2,"snum"=>1,"enum"=>5],
- ["id"=>6,"weight"=>110,"type"=>15,"rtype"=>2,"snum"=>6,"enum"=>10],
- ["id"=>7,"weight"=>50,"type"=>15,"rtype"=>2,"snum"=>11,"enum"=>20],
- ["id"=>8,"weight"=>10,"type"=>15,"rtype"=>2,"snum"=>21,"enum"=>50],
- ["id"=>9,"weight"=>80,"type"=>1,"rtype"=>1,"snum"=>1,"enum"=>1],
- ];
- //关于游戏记录的说明:rid 1消耗次数 2购买次数
- /**
- * Notes:配置
- * User: wsc
- * Time: 2020/11/18 14:39
- * @return array
- */
- public function getConfig(){
- $config = oo::commonOprModel('readconfig')->getSysCon('CoinDozer',"config");
- $config = !empty($config)?json_decode($config,true):[];
- if(empty($config)||!is_array($config)){
- $config['gameCfg'] = $this->gameCfg;//游戏基本配置
- $config['exchangeRateCfg'] = $this->exchangeRateCfg;//汇率规则配置
- $config['siteProbCfg'] = $this->siteProbCfg;//位置概率配置
- $config['propDropRule'] = $this->propDropRule;//道具掉落规则
- $config['propProbCfg'] = $this->propProbCfg;//道具掉落物品生成概率配置
- }
- return $config;
- }
- /**
- * Notes:获取游戏信息
- * User: wsc
- * Time: 2020/11/24 15:12
- * @param $uid
- * @return mixed
- */
- public function getOpenInfo($uid){
- $gameCfg = $this->getConfig()['gameCfg'];
- $userInfo= oo::commonOprModel('member')->getUserBasic($uid);
- $isClose =false;
- if(!isset($gameCfg['androidSet'])) $gameCfg['androidSet']= $this->gameCfg['androidSet'];//未配置时初始化本地设置
- if(!isset($gameCfg['iosSet'])) $gameCfg['iosSet']= $this->gameCfg['iosSet'];//未配置时初始化本地设置
- $sid = oo::getDefinedSid($uid);
- if ($sid==1&&($gameCfg['androidSet']['status']!=1||!oo::compareVersion($userInfo['version'],$gameCfg['androidSet']['minVersion']))) $isClose =true;
- if ($sid==2&&($gameCfg['iosSet']['status']!=1||!oo::compareVersion($userInfo['version'],$gameCfg['iosSet']['minVersion']))) $isClose =true;
- if ($gameCfg['status']!=1) $isClose =true;
- if($isClose){
- $data['buyLimitPrize'] = 0;
- $data['haveLimit'] = 0;
- $data['isOpen']=0;
- $data['status']=0;
- $data['openLevel'] =999;
- return $data;
- }
- $userGameInfo= $this->getUserGameInfo($uid);
- $playLimit = intval($userGameInfo['dayInfo']['playLimit']);
- $allLimit = $gameCfg['freeLimit']+$userGameInfo['dayInfo']['buyGameLimit'];
- $data['isSpecial'] = $this->specialUser($uid)?1:0;
- if($data['isSpecial']){//广告渠道用户
- $thisCfg = $gameCfg['specialCfg'];
- }else{
- $thisCfg = $gameCfg['commonCfg'];
- }
- $status =1;
- if($thisCfg['openExp']==1&&$userInfo['levelId']==$thisCfg['expLevel']){//体验次数
- $allLimit = $thisCfg['freeExpLimit'];
- if($allLimit<=$playLimit){//次数不够
- $status = errorCode::LIMIT_NOT_RNOUGH;
- }
- }
- //当没有开放体验,或者开放体验等级不满足的情况下,等级不够
- if(($userInfo['levelId']!=$thisCfg['expLevel']||$thisCfg['openExp']!=1)&&$userInfo['levelId']<$thisCfg['openLevel']){
- $status = errorCode::LEVEL_NOT_RNOUGH;
- }
- $have = $allLimit-$playLimit;
- $data['buyLimitPrize'] = $gameCfg['buyGameLimit']['prize'];
- $data['haveLimit'] = $have>0?$have:0;
- $data['isOpen'] =$status>0?1:0;
- $data['status'] =$gameCfg['status'];
- $data['openLevel'] = $thisCfg['openLevel'];
- return $data;
- }
- /**
- * Notes:获取用户游戏信息
- * User: wsc
- * Time: 2020/11/18 17:32
- * @param $uid
- * @return mixed
- */
- public function getUserGameInfo($uid){
- $key1 = okeys::userGameInfoCoinDozer($uid);
- $info['info'] = oo::commonOprRedis('usercache')->hGetAll($key1);
- if(empty($info['info'])){
- $tb = otable::usercoindozer();
- $sql = "select * from {$tb} where uid={$uid}";
- $datas = oo::commonOprDb('userinfo')->getOne($sql,1);
- if(!empty($datas)){
- $res = true;
- }else{
- $datas = ["uid"=>$uid,"level"=>1,"exp"=>0,"p1"=>0,"p2"=>0,"ext"=>"","create_ts"=>time()];
- if(funs::concurrentLock($uid,'insert_coindozer')){
- $sql = funs::db_insertSQL($tb,$datas);
- $res = oo::commonOprDb('userinfo')->query($sql);
- }else{
- $res =true;
- }
- }
- if($res){
- oo::commonOprRedis('usercache')->hMset($key1,$datas);
- oo::commonOprRedis('usercache')->expire($key1,oo::redisRandomExpire(86400*7));
- }
- $info['info'] = $datas;
- }
- !empty($info['info']['ext'])&&$info['info']['ext'] = json_decode($info['info']['ext'],true);
- $info['dayInfo'] = $this->getUserDayGameInfo($uid);
- return $info;
- }
- /**
- * Notes:获取当日数据
- * User: wsc
- * Time: 2020/12/22 16:09
- * @param $uid
- * @return array
- */
- public function getUserDayGameInfo($uid){
- $key2 = okeys::userDayGameInfoCoinDozer($uid);
- $dayInfo = oo::commonOprRedis('usercache')->hGetAll($key2);
- if(empty($dayInfo)){
- $dayInfo = ["playLimit"=>0,"putLimit"=>0,"buyGameLimit"=>0,"buyP1Limit"=>0,"buyP2Limit"=>0,"useP1Limit"=>0,"useP2Limit"=>0];//初始化次数
- oo::commonOprRedis('usercache')->hMset($key2,$dayInfo);
- oo::commonOprRedis('usercache')->expire($key2,oo::todayDeadline());//设置过期
- }
- return $dayInfo;
- }
- /**
- * Notes:设置次数记录
- * User: wsc
- * Time: 2020/12/22 16:12
- * @param $uid
- * @param $key string 要设置的类型
- * @param $num int 要设置的数量
- * @param $type int 日志类型
- * @param $rid int 原因id
- * @param $limit int 第几次
- * @param string $ext
- */
- public function changeUserDayGameInfo($uid,$key,$num,$type,$rid,$ext=''){
- $keys = okeys::userDayGameInfoCoinDozer($uid);
- if(!oo::commonOprRedis('usercache')->exists($keys)){//防止缓存空置期异常不过期
- $this->getUserDayGameInfo($uid);
- }
- $limit = oo::commonOprRedis('usercache')->hIncrBy($keys,$key,$num);
- if($key!='putLimit'){//不记录当天投放次数
- $log = ["uid"=>$uid,"type"=>$type,"rid"=>$rid,"num"=>$num,"limit"=>$limit,"time"=>time(),"ext"=>$ext];//购买次数记录
- oo::commonOprRedis('statistics')->rpush(okeys::coinDozerGameLogList(),json_encode($log));
- }
- return $limit;
- }
- /**
- * Notes:更新用户游戏信息缓存
- * User: wsc
- * Time: 2020/11/20 18:29
- * @param $uid
- * @param $data
- */
- public function upDataGameInfo($uid,$data){
- $key1 = okeys::userGameInfoCoinDozer($uid);
- foreach ($data as $k=>$v){
- oo::commonOprRedis('usercache')->hSet($key1,$k,$v);
- }
- $key = okeys::Landing("COINDOZER_GAMEDATA");//数据落地标识
- oo::commonOprRedis('Usercache')->zAdd($key,time(),$uid);
- }
- /**
- * Notes:购买
- * User: wsc
- * Time: 2020/11/20 18:00
- * @param int $uid 用户id
- * @param int $num 购买数量
- * @param int $type 0购买游戏次数 1购买道具p1 2购买道具p2
- * @return array
- */
- public function buy($uid,$num=1,$type=0){
- $num =abs($num);
- $cfgs = $this->getConfig()['gameCfg'];
- $userGameInfo = $this->getUserGameInfo($uid);
- if($type==1){
- $key = "buyP1Limit";
- $cfg = $cfgs['buyGameProp']['p1'];
- $p = 'p1';
- $rid =91;
- }else if($type==2){
- $key = "buyP2Limit";
- $cfg = $cfgs['buyGameProp']['p2'];
- $p = 'p2';
- $rid =91;
- }else{
- $key="buyGameLimit";
- $rid =90;
- $cfg = $cfgs['buyGameLimit'];
- }
- $buyLimit = intval($userGameInfo['dayInfo'][$key]);//已购买的次数
- $userAttr = oo::commonOprModel('member')->getUserAssetsInfo($uid);
- $data = $userGameInfo;
- $data['userAttr']['money'] = $userAttr['money'];
- $data['userAttr']['diamond'] = $userAttr['diamond'];
- //道具购买配置
- if($buyLimit+$num>$cfg['maxNum']){//单日购买最大次数上限
- return ["code"=>errorCode::LIMIT_NOT_RNOUGH,"data"=>$data];
- }
- if($cfg['prize']*$num>$userAttr['diamond']){//钻石不足
- return ["code"=>errorCode::DIAMOND_NOT_ENOUGH,"data"=>$data];
- }
- $res =oo::commonOprModel('member')->optProperty($uid,["diamond"=>$cfg['prize']*$num],"-",$rid,"购买数:$num:{$key}");
- if(!$res){
- return ["code"=>errorCode::DIAMOND_NOT_ENOUGH,"data"=>$data];
- }
- if($type>0){//道具发货
- $count = $userGameInfo['info'][$p]+$num;
- $this->upDataGameInfo($uid,[$p=>$count]);
- $data['info'][$p]=$count;
- }else{
- $data['dayInfo'][$key] = $userGameInfo['dayInfo'][$key]+$num;
- }
- //写记录
- $this->changeUserDayGameInfo($uid,$key,$num,2,$rid,$key);
- $putLimit = $data['dayInfo']['putLimit'];
- unset($data['dayInfo'],$data['info']['uid'],$data['info']['create_ts'],$data['info']['ext']);
- $data['dayInfo']['putLimit'] = $putLimit;
- $data['userAttr']['diamond'] = $userAttr['diamond']-$cfg['prize']*$num;
- return ["code"=>errorCode::SUCCESS,"data"=>$data];
- }
- /**
- * Notes:使用游戏道具
- * User: wsc
- * Time: 2020/11/20 18:29
- * @param $uid
- * @param $type
- */
- public function useProp($uid,$type){
- $userGameInfo = $this->getUserGameInfo($uid);
- $userAttr = oo::commonOprModel('member')->getUserAssetsInfo($uid);
- if($type==1){
- $key = "useP1Limit";
- $p='p1';
- }else if($type==2){
- $key = "useP2Limit";
- $p='p2';
- }else{
- return ["code"=>errorCode::REQUEST_PARAM_ERROR,"data"=>[]];
- }
- $pNum = intval($userGameInfo['info'][$p]);
- $data = $userGameInfo;
- $data['userAttr']['diamond'] = $userAttr['diamond'];
- $data['userAttr']['money'] = $userAttr['money'];
- $data['type'] = $type;
- if($pNum==0){
- return ["code"=>errorCode::PROP_NOT_RNOUGH,"data"=>$data];
- }
- //扣除道具
- $num = $pNum-1;
- $this->upDataGameInfo($uid,[$p=>$num]);
- $data['info'][$p]=$num;
- $putLimit = $data['dayInfo']['putLimit'];
- unset($data['dayInfo'],$data['info']['uid'],$data['info']['create_ts'],$data['info']['ext']);
- $data['dayInfo']['putLimit'] = $putLimit;
- //写道具使用记录
- $this->changeUserDayGameInfo($uid,$key,1,3,94,$key);
- return ["code"=>errorCode::SUCCESS,"data"=>$data];
- }
- /**
- * Notes:开启游戏
- * User: wsc
- * Time: 2020/11/18 17:23
- * @param $uid
- * @return array
- */
- public function openGame($uid,$init=0){
- if($init){//重新初始化
- oo::commonOprRedis('usercache')->delete(okeys::userDayGameInfoCoinDozer($uid));
- oo::commonOprRedis('usercache')->delete(okeys::userCoinDozerPropList($uid));
- }
- $cfgs = $this->getConfig();
- unset($cfgs['propProbCfg']);
- $gameCfg = $cfgs['gameCfg'];
- $userGameInfo = $this->getUserGameInfo($uid);
- $playLimit = intval($userGameInfo['dayInfo']['playLimit']);
- $userInfo = oo::commonOprModel('member')->getUserBasic($uid);
- $allLimit = $gameCfg['freeLimit']+$userGameInfo['dayInfo']['buyGameLimit'];
- $status =1;
- $cfgs['exchangeRateCfg'] = $this->getCoinEXRateCfg($cfgs['exchangeRateCfg'],$userInfo['levelId']);
- $data['endTime']= timeFuns::today()[1]-30;
- $data['status']=0;
- $data["userData"] = $userGameInfo;
- $putLimit = $data["userData"]['dayInfo']['putLimit'];
- unset($data["userData"]['dayInfo'],$data["userData"]['info']['uid'],$data["userData"]['info']['create_ts'],$data["userData"]['info']['ext']);
- $data["userData"]['dayInfo']['putLimit'] = $putLimit;
- $data["dropPropList"] =[];
- $data["gameData"] =[
- 'initTableModel'=>0,//初始模式
- // 'initTableData'=>[],//初始化桌面
- 'config'=>$cfgs,
- ];
- $isPass = $this->specialUser($uid);//特殊人群(无视等级,不使用有效次数,多免费体验次数)
- if($isPass){//广告渠道用户
- $thisCfg = $gameCfg['specialCfg'];
- }else{
- $thisCfg = $gameCfg['commonCfg'];
- }
- if($thisCfg['openExp']==1&&$userInfo['levelId']==$thisCfg['expLevel']){//体验次数
- $allLimit = $thisCfg['freeExpLimit'];
- }
- //当没有开放体验,或者开放体验等级不满足的情况下,等级不够
- if(($userInfo['levelId']!=$thisCfg['expLevel']||$thisCfg['openExp']!=1)&&$userInfo['levelId']<$thisCfg['openLevel']){
- $status = errorCode::LEVEL_NOT_RNOUGH;
- }
- if($allLimit<=$playLimit){//次数不够
- $status = errorCode::LIMIT_NOT_RNOUGH;
- }
- if($gameCfg['status']!=1){//未开启
- $status = errorCode::NOT_OPEN;
- }
- if($status>0){
- $props = array_values($this->getDropPropList($uid));
- if($playLimit==0){//每天首次玩
- $data['gameData']['initTableModel'] = $gameCfg['initTableModel'];
- // $data['gameData']['initTableData'] = $this->initTabelData($uid);//初始化桌面数据
- }
- //写玩次数记录并改变次数
- $playLimit = $this->changeUserDayGameInfo($uid,'playLimit',1,1,1,$isPass);
- // $data["userData"]['dayInfo']['playLimit'] = $playLimit;
- $data["dropPropList"] = $props;
- $data['status'] = 1;
- }
- oo::commonOprModel('currency')->participation($uid, 'coindozer', 0); //推金币参与率统计
- return ["code"=>$status,"data"=>$data];
- }
- /**
- * Notes:上报领奖及消耗
- * User: wsc
- * Time: 2020/11/19 15:27
- * @param int $uid
- * @param int $putNum 投放的游戏内金币个数
- * @param int $dropNum 掉落的游戏内金币个数
- * @param string $lostPidsStr 丢失的道具
- * @param string $getPidsStr 获取的道具
- * @return string
- */
- public function sub($uid,$putNum,$dropNum,$lostPidsStr="",$getPidsStr=""){
- if(intval($putNum)<0){
- return oo::response(errorCode::REQUEST_PARAM_ERROR,[],'error args');
- }
- $userGameInfo = $this->getUserGameInfo($uid);
- $userAttr = oo::commonOprModel('member')->getUserAssetsInfo($uid);
- $exchangeRateCfg = $this->getConfig()['exchangeRateCfg'];
- $exchangeRateCfg = $this->getCoinEXRateCfg($exchangeRateCfg,$userAttr['levelId']);
- //汇率计算
- $exchangeRateCfg =array_column($exchangeRateCfg,null,'level');
- $bet = intval($exchangeRateCfg[$userGameInfo['info']['level']]['er']);//汇率
- $lostMoney = $bet*$putNum;
- $canGetMoney = $getMoney = $bet*$dropNum;
- if(!empty($getPidsStr)){
- $getPids = explode(',',$getPidsStr);
- foreach ($getPids as $solePid){
- $arr = explode('_',$solePid);
- if($arr[0]==14){
- $canGetMoney +=intval($arr[1])*$bet;
- }
- }
- }
- if($userAttr['money']+$canGetMoney<$lostMoney){
- $data['userAttr']['money'] = $userAttr['money'];
- $data['userAttr']['spins'] = $userAttr['spins'];
- $data['userAttr']['coins'] = $userAttr['money'];
- $data['userAttr']['diamond'] = $userAttr['diamond'];
- oo::logs()->debug3(['time'=>date("Y-m-d H:i:s"),"uid"=>$uid,"putNum"=>$putNum,"dropNum"=>$dropNum,"lostPidsStr"=>$lostPidsStr,"getPidsStr"=>$getPidsStr,"canGetMoney"=>$canGetMoney,"havemoney"=>$userAttr['money']],'coindozer.log');
- return oo::response(errorCode::MONEY_NOT_RNOUGH,$data,'be short of gold coins');
- }
- if($getMoney>0){
- oo::commonOprModel('member')->optProperty($uid,["money"=>$getMoney],"+",92);//加钱
- }
- if($lostMoney>0){
- oo::commonOprModel('member')->optProperty($uid,["money"=>$lostMoney],"-",92);//扣钱
- }
- $proteEndTs = oo::commonOprModel('activitynew')->getEndproteTime($uid);
- if($getMoney>0){
- $ttl = $proteEndTs-time();
- if($ttl < 100){
- oo::commonOprModel('member')->setUserStealProtect($uid,300);
- $proteEndTs = time()+298;
- }
- }
- if(!empty($lostPidsStr)){//丢失的道具
- $lostPids = explode(',',$lostPidsStr);
- foreach ($lostPids as $solePid){
- oo::commonOprRedis('usercache')->hDel(okeys::userCoinDozerPropList($uid),$solePid);//剔除缓存道具
- }
- }
- $getList = [];
- if(!empty($getPids)){//获得的道具
- foreach ($getPids as $solePid){
- $propStr = oo::commonOprRedis('usercache')->hGet(okeys::userCoinDozerPropList($uid),$solePid);
- if($propStr){
- $prop = json_decode($propStr,true);
- if($prop['type']==14){
- $prop['num'] = $prop['num']*$bet;
- }
- oo::commonOprModel('member')->sendReward($uid,$prop['type'],$prop['num'],93,'');//发放道具
- oo::commonOprRedis('usercache')->hDel(okeys::userCoinDozerPropList($uid),$solePid);//剔除缓存道具
- $getList[] = $solePid;//得到的道具id
- }
- }
- }
- $data = $userGameInfo;
- unset($data['dayInfo'],$data['info']['uid'],$data['info']['create_ts'],$data['info']['ext']);
- $limit = $this->changeUserDayGameInfo($uid,'putLimit',$putNum,1,1);//累计投放次数
- $data['dayInfo']['putLimit'] = $limit;
- $userAttr = oo::commonOprModel('member')->getUserAssetsInfo($uid);
- $data['userAttr']['money'] = $userAttr['money'];
- $data['userAttr']['diamond'] = $userAttr['diamond'];
- $data['userAttr']['spins'] = $userAttr['spins'];
- $data['getData'] = $getList;
- $data['proteEndTs'] = $proteEndTs;
- return oo::response(1,$data,'success');
- }
- public function getCoinEXRateCfg($cfg,$levelId){
- foreach ($cfg as $k=> $v){
- if($v['er']>100){//兼容线上(防止版本更新时间差导致的异常)
- $v['er'] =1;
- }
- $cfg[$k]['er'] = oo::commonOprModel('activitynew')->getCoinRewardByTypeAndLevel('coin_dozer',$levelId)*$v['er'];
- }
- return $cfg;
- }
- /**
- * Notes:获取道具列表
- * User: wsc
- * Time: 2020/11/19 14:13
- * @param $uid
- * @param string $pids
- * @return array
- */
- public function getDropPropList($uid,$type=0,$pids=''){
- $key = okeys::userCoinDozerPropList($uid);
- if($pids){
- oo::commonOprRedis('usercache')->delete($key);
- }
- $jsonArr = oo::commonOprRedis('usercache')->hGetAll($key);
- $props =funs::getArrFromJsonArr($jsonArr);
- $haveCount = !empty($props)?intval(count($props)):0;
- if($haveCount<20){
- $newProps = $this->getRandProp($uid,50-$haveCount,$pids);
- if($type){
- return $newProps;
- }
- $props = array_merge($props,$newProps);
- }
- return $props;
- }
- /**
- * Notes:获取随机道具
- * User: wsc
- * Time: 2020/11/18 20:36
- * @param int $num 随机个数
- * @param int $pid 指定道具
- * @return array
- */
- public function getRandProp($uid,$num=1,$pids=0){
- $datas = [];
- $cfg = $this->getConfig()['propProbCfg'];
- $fplist = $this->filtrationProp($uid);
- if(!empty($fplist)){//过滤道具
- foreach ($cfg as $k=>$v){
- if(in_array($v['type'],$fplist)){
- unset($cfg[$k]);
- }
- }
- }
- $cfg = array_column($cfg,null,'id');
- if($pids){//指定道具
- $ids =[$pids];
- }else{//随机概率道具
- foreach ($cfg as $v){
- $idList[$v['id']]=$v['weight'];
- }
- for ($i=$num;$i--;){
- $ids[] = funs::get_randByProb($idList);
- }
- }
- $key = okeys::userCoinDozerPropList($uid);
- foreach ($ids as $k=>$id){
- $data = [];
- $prop = $cfg[$id];
- $data['type'] = $prop['type'];
- if($prop['rtype']==1){
- $data['num'] = $prop['snum'];
- }else{
- $data['num'] = mt_rand($prop['snum'],$prop['enum']);
- }
- $data['solePid'] = $prop['type'].'_'.$data['num'].'_'.oo::getMsectime().'_'.$k;
- $datas[] = $data;
- oo::commonOprRedis('usercache')->hSet($key,$data['solePid'],json_encode($data));//缓存掉落道具,用于验证道具
- }
- oo::commonOprRedis('usercache')->expire($key,oo::todayDeadline());
- return $datas;
- }
- /**
- * Notes:获取初始化桌面数据
- * User: wsc
- * Time: 2020/11/19 15:35
- * @param $uid
- * @return array
- */
- public function initTabelData($uid){
- $n =mt_rand(1,3);
- $data = [
- "coins"=>35+$n,
- "props"=>$this->getRandProp($uid,$n),
- ];
- return $data;
- }
- /**
- * Notes:特殊人群判别
- * User: wsc
- * Time: 2020/11/19 15:39
- * @param $uid
- * @return bool
- */
- public function specialUser($uid){
- $ret = oo::commonOprModel('member')->isPushCoinsUser($uid);
- return $ret;
- }
- /**
- * Notes:过滤道具
- * User: wsc
- * Time: 2020/11/19 15:07
- * @param $uid
- * @return array
- */
- public function filtrationProp($uid){
- $arr = [];
- $lv = oo::commonOprModel('member')->getUserLevelId($uid);
- if($lv<4){//低等级过滤卡片宝箱,宠物粮食
- $arr = [1,2,3,4,9];
- }
- return $arr;
- }
- /**
- * Notes:定时落地游戏数据
- * User: wsc
- * Time: 2020/11/26 15:38
- * @return mixed
- */
- public function cronToLandGameLog($sta=false){
- $key = okeys::coinDozerGameLogList();
- $tb = otable::gamelog_coindozer();
- $list = oo::commonOprRedis('statistics')->lGetRange($key,0,999);
- $count = count($list);
- //按月分表
- $td = date('Ym');
- $tbs = "gamelog_coindozer_{$td}";
- $query = "SHOW TABLES LIKE '$tbs'";
- $tbInfo = oo::commonOprDb('log')->getOne($query,1);
- if(empty($tbInfo)){
- $sql = oo::cfg('sql')['gamelog_coindozer'];
- $sql = str_replace('#table#', "gamelog_coindozer_{$td}", $sql);
- $res1 =oo::commonOprDb('log')->query($sql);
- }else{
- $res1 =true;
- }
- $tb = $res1?$tbs:$tb;
- if($list){
- foreach ($list as $k=>$v){
- $one = json_decode($v,true);
- $value = "(";
- foreach ($one as $val){
- $value .="'{$val}',";
- }
- $value = trim($value,',');
- $value .=")";
- $values[] = $value;
- }
- $fieldArr = ["uid","type","rid","num","limit","time","ext"];
- $keys = array_values($fieldArr);
- $fields = '(`'.implode('`, `',$keys).'`)';
- $values = trim(implode(',',$values),',');
- $sql= "INSERT INTO {$tb} {$fields} VALUE {$values}";
- $res = oo::commonOprDb('log')->query($sql);
- if($res){
- oo::commonOprRedis('statistics')->lTrim($key,$count,-1);
- }
- }
- //统计入表
- $time = date('Gi', time());
- if($time=='006'||$sta){
- $ts1 =timeFuns::yesterday()[0];
- $ts2 =timeFuns::yesterday()[1];
- $tb2 = 'gamelog_coindozer_'.date('Ym',strtotime('-1 days'));
- $query = "SHOW TABLES LIKE '$tb2'";
- $tbInfo = oo::commonOprDb('log')->getOne($query,1);
- if(!$tbInfo){
- $tb2 = 'gamelog_coindozer';
- }
- //人次
- $sqls['open_user'] = "SELECT count(a.uid) as num FROM (SELECT uid,count(uid) FROM {$tb2} WHERE type=1 and rid=1 and time>={$ts1} and time<={$ts2} GROUP BY uid) as a";
- $sqls['open_num'] = "SELECT count(*) as num FROM {$tb2} WHERE type=1 and rid=1 and time>={$ts1} and time<={$ts2}";
- $sqls['buy_game_num'] = "SELECT count(*) as num FROM {$tb2} WHERE type=2 and ext='buyGameLimit' and time>={$ts1} and time<={$ts2}";
- $sqls['buy_p1_num'] = "SELECT count(*) as num FROM {$tb2} WHERE type=2 and ext='buyP1Limit' and time>={$ts1} and time<={$ts2}";
- $sqls['buy_p2_num'] = "SELECT count(*) as num FROM {$tb2} WHERE type=2 and ext='buyP2Limit' and time>={$ts1} and time<={$ts2}";
- foreach ($sqls as $k=> $sq){
- $insertData[$k] = intval(oo::commonOprDb('log')->getOne($sq,1)['num']);
- }
- $insertData['date'] = date('Ymd',$ts1);
- $staTb = otable::coinDozerGameSta();
- $sql2 = funs::db_insertSQL($staTb,$insertData);
- oo::commonOprDb('statistics')->query($sql2);
-
- }
- return $res;
- }
- }
|