sitestat(); $stat = $this->statistics(); //玩家注册 $data['player_regist_yes'] = $info['yesterday']; $data['player_regist_tod'] = $info['today']; $data['player_regist_week'] = $stat['realtime_data']['thisweek_user']; $data['player_reigst_mon'] = $stat['realtime_data']['thismounth_user']; $data['player_regist_all'] = $info['user']; //玩家活跃 $data['act_yes'] = $info['ylogin']; $data['act_tod'] = $info['tlogin']; $data['act_seven'] = $info['ulogin']; $data['act_week'] = $stat['realtime_data']['thisweek_active']; $data['act_mon'] = $stat['realtime_data']['thismounth_active']; //充值人数 $data['payer_yes'] = $info['yfufei']; $data['payer_tod'] = $info['tfufei']; $data['payer_all'] = $info['afufei']; //充值 $data['pay_add_yes'] = $info['ysamount']; $data['pay_add_tod'] = $info['tsamount']; $data['pay_add_all'] = $info['asamount']; //流水 $data['pay_tod'] = $stat['realtime_data']['today_pay']; $data['pay_week'] = $stat['realtime_data']['thisweek_pay']; $data['pay_mon'] = $stat['realtime_data']['thismounth_pay']; $data['pay_all'] = $stat['platform_data']['all_pay']; //游戏接入数量 $data['game_add_yes'] = $info['yadd']; $data['game_add_tod'] = $info['tadd']; $data['game_add_all'] = $info['game']; $data['game_and_all'] = $stat['platform_data']['all_android']; $data['game_ios_all'] = $stat['platform_data']['all_ios']; //渠道增加数量 $data['pro_add_yes'] = $info['ypadd']; $data['pro_add_tod'] = $info['tpadd']; $data['pro_add_all'] = $info['promote']; $data['pro_complete'] = $stat['platform_data']['all_promote']; //渠道支付总数 $data['pro_pay_all'] = $stat['platform_data']['all_tpay']; //推广渠道总数 $data['pro_player_all'] = $stat['platform_data']['all_tuser']; //首页七天流水 七天注册统计 $data['seven_pay_min'] = $info['pay']['min']; $data['seven_pay_max'] = $info['pay']['max']; $data['seven_pay_data'] = $info['pay']['data']; $data['seven_pay_cate'] = $info['pay']['cate']; $data['seven_reg_min'] = $info['reg']['min']; $data['seven_reg_max'] = $info['reg']['max']; $data['seven_reg_data'] = $info['reg']['data']; $data['seven_reg_cate'] = $info['reg']['cate']; $data['create_time'] = time(); // 手续费 $data['poundage_all'] = $stat['poundage_all']; M('Data','tab_')->add($data); $this->launch_data(); } public function sitestat(){ $user = M("User","tab_"); $userlogin = M("UserLoginRecord","tab_"); $game = M("Game","tab_"); $spend = M('Spend',"tab_"); $deposit = M('Deposit',"tab_"); $promote = M("Promote","tab_"); $yesterday = $this->total(5); $today = $this->total(1); $week = $this->total(9); $month = $this->total(3); $info['user'] = $user->where(['puid'=>0])->count(); $info['yesterday']= $user->where(['puid'=>0])->where("register_time".$yesterday)->count(); $info['today']= $user->where(['puid'=>0])->where("register_time".$today)->count(); $info['login']= $user->where(['puid'=>0])->where("login_time".$today)->count(); $info['game'] = $game->where(['apply_status'=>1,'online_status'=>1])->count(); $info['tadd'] = $game->where("create_time".$today)->where(['apply_status'=>1,'online_status'=>1])->count(); $info['yadd'] = $game->where("create_time".$yesterday)->where(['apply_status'=>1,'online_status'=>1])->count(); $samount = $spend->field('sum(pay_amount) as amount')->where("pay_status=1 and pay_way <> 0")->select(); if($samount[0]['amount']){ $info['samount']=$this->test($samount[0]['amount']); }else{ $info['samount']=0; } $damount = $deposit->field('sum(pay_amount) as amount')->where("pay_status=1 and pay_way<>0")->select(); if($damount[0]['amount']){ $info['damount']=$damount[0]['amount']==''?0:$damount[0]['amount']; }else{ $info['damount']=0; } //七日活跃 $wurel=$user ->field('id as user_id') ->where('register_time'.$week) ->select(false); $ulogin=$userlogin ->field('user_id') ->where("login_time".$week) ->union($wurel) ->group('user_id') ->select(); //今日活跃 $turel=$user ->field('id as user_id') ->where('register_time'.$today) ->select(false); $tlogin=$userlogin ->field('user_id') ->where("login_time".$today) ->union($turel) ->group('user_id') ->select(); //昨日活跃 $yurel=$user ->field('id as user_id') ->where('register_time'.$yesterday) ->select(false); $ylogin=$userlogin ->field('user_id') ->where("login_time".$yesterday) ->union($yurel) ->group('user_id') ->select(); $ulogin=count($ulogin); $tlogin=count($tlogin); $ylogin=count($ylogin); $info['ulogin'] = $ulogin; $info['tlogin'] = $ylogin; $info['ylogin'] = $tlogin; // // 付费玩家 游戏付费+平台币充值 //全部平台币充值 $abfufei = M('bind_recharge','tab_')->field('user_id')->where(array('pay_status'=>1))->group('user_id')->select(false); $adfufei=$deposit ->field('user_id') ->where(array('pay_status'=>1)) ->group('user_id') ->select(false); //两表并集 $afufei=$spend ->field('user_id') ->union($abfufei) ->union($adfufei) ->where(array('pay_status'=>1,'pay_way'=>array('gt',0))) ->group('user_id') ->select(); //昨日平台币充值 $ybfufei = M('bind_recharge','tab_')->field('user_id')->where(array('pay_status'=>1,'_string'=>'create_time '.$yesterday))->group('user_id')->select(false); $ydfufei=$deposit ->field('user_id') ->where("pay_status=1 and create_time".$yesterday) ->group('user_id') ->select(false); //两表并集 $yfufei=$spend ->field('user_id') ->union($ybfufei) ->union($ydfufei) ->where("pay_status=1 and pay_time".$yesterday) ->group('user_id') ->select(); //今日平台币充值 $tbfufei = M('bind_recharge','tab_')->field('user_id')->where(array('pay_status'=>1,'_string'=>'create_time '.$today))->group('user_id')->select(false); $tdfufei=$deposit ->field('user_id') ->where("pay_status=1 and create_time".$today) ->group('user_id') ->select(false); //两表并集 $tfufei=$spend ->field('user_id') ->union($tbfufei) ->union($tdfufei) ->where("pay_status=1 and pay_time".$today) ->group('user_id') ->select(); $info['afufei']=count($afufei); $info['yfufei']=count($yfufei); $info['tfufei']=count($tfufei); // // 游戏充值 $asamount = $spend->field('sum(pay_amount) as amount')->where("pay_status=1 and pay_way >= 0")->find(); $tsamount = $spend->field('sum(pay_amount) as amount')->where("pay_status=1 and pay_way >= 0 and pay_time".$today)->find(); $ysamount = $spend->field('sum(pay_amount) as amount')->where("pay_status=1 and pay_way >= 0 and pay_time".$yesterday)->find(); $info['asamount'] = $asamount['amount']?$asamount['amount']:0; $info['tsamount'] = $tsamount['amount']?$tsamount['amount']:0; $info['ysamount'] = $ysamount['amount']?$ysamount['amount']:0; $info['promote'] = $promote->count(); $info['tpadd'] = $promote->where("create_time".$today)->count(); $info['ypadd'] = $promote->where("create_time".$yesterday)->count(); $doc = D("Document"); $b =$this->cate("blog"); $m =$this->cate("media"); $blog = $doc->table("__DOCUMENT__ as d") ->where("d.status=1 and d.display=1 and d.category_id in (".$b.")")->count(); $media = $doc->table("__DOCUMENT__ as d") ->where("d.status=1 and d.display=1 and d.category_id in (".$m.")")->count(); $info['document'] = $this->test($blog + $media); $info['blog']=$this->test($blog); $info['media']=$this->test($media); return $info; } public function auto_rrdae(){ var_dump("fenghuohuyu"); } public function statistics(){ //定义表名 $user = M("User","tab_"); $userlogin = M("user_login_record","tab_"); $spend = M('Spend',"tab_"); $deposit = M('Deposit',"tab_"); $promote = M("Promote","tab_"); $game = M("Game","tab_"); $gamesource = M("Game_source","tab_"); $wgc = M('WithdrawGoldCoin','tab_'); $order = M('Order','tab_'); //平台数据概况 $platform_data['all_user']=$user->count();//累计注册玩家人数 //全部平台币充值 $adfufei=$deposit ->field('user_id') ->where(array('pay_status'=>1)) ->group('user_id') ->select(false); //两表并集 $afufei=$spend ->field('user_id') ->union($adfufei) ->where(array('pay_status'=>1)) ->group('user_id') ->select(); $platform_data['all_pay_user']=count($afufei);//累计付费玩家人数包括平台币 //$spay=$spend->where(array('pay_status'=>1))->sum('pay_amount'); //$dpay=$deposit->where(array('pay_status'=>1))->sum('pay_amount'); $spendmap['pay_status']=1; $bindRecharge_data = M('bind_recharge','tab_')->where($spendmap)->sum('real_amount'); $deposit_data = $deposit->where($spendmap)->sum('pay_amount'); $spendmap['pay_way']=array('gt',0); $spend_data = $spend->where($spendmap)->sum('pay_amount'); $spay = $bindRecharge_data + $deposit_data + $spend_data; $platform_data['all_pay']=$this->test($spay);//累计流水 $platform_data['all_promote']=$promote->where(array('status'=>1))->count();//累计渠道 $platform_data['all_game']=$game->where(['apply_status'=>1,'online_status'=>1])->count();//累计游戏 $platform_data['all_android']=$gamesource->where(array('file_type'=>1))->count();//累计安卓包 $platform_data['all_ios']=$gamesource->where(array('file_type'=>2))->count();//累计苹果包 $platform_data['all_tuser']=$user->where(array('promote_id'=>array('gt',0),'puid'=>0))->count();//累计渠道注册玩家 //$tspay=$spend->where(array('promote_id'=>array('gt',0)))->where(array('pay_status'=>1))->sum('pay_amount');//累计渠道充值玩家 //$dspay =$deposit->where(array('promote_id'=>array('gt',0)))->where(array('pay_status'=>1))->sum('pay_amount'); $pspendmap['pay_status']=1; $pspendmap['promote_id']=array('neq',0); $pbindRecharge_data = M('bind_recharge','tab_')->where($pspendmap)->sum('real_amount'); $pdeposit_data = $deposit->where($pspendmap)->sum('pay_amount'); $pspendmap['pay_way']=array('gt',0); $pspend_data = $spend->where($pspendmap)->sum('pay_amount'); $tspay = $pbindRecharge_data + $pdeposit_data + $pspend_data; $platform_data['all_tpay']=$this->test($tspay);//累计渠道总流水 $result['platform_data'] = $platform_data; //实时数据概况 $today = $this->total(1); $thisweek = $this->total(2); $thismounth = $this->total(3); //注册 $realtime_data['today_user']=$user->where(array('register_time'.$today))->count();//今日注册 $realtime_data['thisweek_user']=$user->where(array('register_time'.$thisweek))->count();//本周注册 $realtime_data['thismounth_user']=$user->where(array('register_time'.$thismounth))->count();//本月注册 //活跃 //今日活跃 $turel=$user ->field('id as user_id') ->where('register_time'.$today) ->select(false); $tlogin=$userlogin ->field('user_id') ->where("login_time".$today) ->union($turel) ->group('user_id') ->select(); //本周活跃 $wurel=$user ->field('id as user_id') ->where('register_time'.$thisweek) ->select(false); $wlogin=$userlogin ->field('user_id') ->where("login_time".$thisweek) ->union($wurel) ->group('user_id') ->select(); //本月活跃 $murel=$user ->field('id as user_id') ->where('register_time'.$thismounth) ->select(false); $mlogin=$userlogin ->field('user_id') ->where("login_time".$thismounth) ->union($murel) ->group('user_id') ->select(); $realtime_data['today_active']=count($tlogin); $realtime_data['thisweek_active']=count($wlogin); $realtime_data['thismounth_active']=count($mlogin); //充值 //今日流水 $todayspay=$spend->where(array('pay_time'.$today))->where(array('pay_status'=>1))->sum('pay_amount'); //$todaydpay=$deposit->where(array('create_time'.$today))->where(array('pay_status'=>1))->sum('pay_amount'); //$realtime_data['today_pay']=$this->test($todayspay+$todaydpay); $realtime_data['today_pay']=$todayspay?$todayspay:0; //本周流水 $weekspay=$spend->where(array('pay_time'.$thisweek))->where(array('pay_status'=>1))->sum('pay_amount'); //$weekdpay=$deposit->where(array('create_time'.$thisweek))->where(array('pay_status'=>1))->sum('pay_amount'); $realtime_data['thisweek_pay']=$weekspay?$weekspay:0; //本月流水 $mounthspay=$spend->where(array('pay_time'.$thismounth))->where(array('pay_status'=>1))->sum('pay_amount'); //$mounthdpay=$deposit->where(array('create_time'.$thismounth))->where(array('pay_status'=>1))->sum('pay_amount'); $realtime_data['thismounth_pay']=$mounthspay?$mounthspay:0; $result['realtime_data'] = $realtime_data; // 手续费 $poundage_all = $wgc->where(['status'=>1])->sum('poundage'); $poundage_all2 = $order->where(['pay_status'=>1])->sum('poundage'); $result['poundage_all'] = floatval($poundage_all)+floatval($poundage_all2); return $result; } private function total($type) { switch ($type) { case 1: { // 今天 $start=mktime(0,0,0,date('m'),date('d'),date('Y')); $end=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1; };break; case 2: { // 本周 //当前日期 $sdefaultDate = date("Y-m-d"); //$first =1 表示每周星期一为开始日期 0表示每周日为开始日期 $first=1; //获取当前周的第几天 周日是 0 周一到周六是 1 - 6 $w=date('w',strtotime($sdefaultDate)); //获取本周开始日期,如果$w是0,则表示周日,减去 6 天 $week_start=date('Y-m-d',strtotime("$sdefaultDate -".($w ? $w - $first : 6).' days')); //本周结束日期 $week_end=date('Y-m-d',strtotime("$week_start +6 days")); //当前日期 $sdefaultDate = date("Y-m-d"); //$first =1 表示每周星期一为开始日期 0表示每周日为开始日期 $first=1; //获取当前周的第几天 周日是 0 周一到周六是 1 - 6 $w=date('w',strtotime($sdefaultDate)); //获取本周开始日期,如果$w是0,则表示周日,减去 6 天 $start=strtotime("$sdefaultDate -".($w ? $w - $first : 6).' days'); //本周结束日期 $end=$start+7*24*60*60-1; };break; case 3: { // 本月 $start=mktime(0,0,0,date('m'),1,date('Y')); $end=mktime(0,0,0,date('m')+1,1,date('Y'))-1; };break; case 4: { // 本年 $start=mktime(0,0,0,1,1,date('Y')); $end=mktime(0,0,0,1,1,date('Y')+1)-1; };break; case 5: { // 昨天 $start=mktime(0,0,0,date('m'),date('d')-1,date('Y')); $end=mktime(0,0,0,date('m'),date('d'),date('Y'))-1; };break; case 6: { // 上周 $start=mktime(0, 0 , 0,date("m"),date("d")-date("w")+1-7,date("Y")); $end=mktime(23,59,59,date("m"),date("d")-date("w")+7-7,date("Y")); };break; case 7: { // 上月 $start=mktime(0, 0 , 0,date("m")-1,1,date("Y")); $end=mktime(23,59,59,date("m") ,0,date("Y")); };break; case 8: { // 上一年 $start=mktime(0,0,0,date('m')-11,1,date('Y')); $end=mktime(0,0,0,date('m')+1,1,date('Y'))-1; };break; case 9: { // 前七天 $start = mktime(0,0,0,date('m'),date('d')-6,date('Y')); $end=mktime(23,59,59,date('m'),date('d'),date('Y')); };break; case 10: { // 前30天 $start = mktime(0,0,0,date('m'),date('d')-29,date('Y')); $end=mktime(23,59,59,date('m'),date('d'),date('Y')); };break; default: $start='';$end=''; } return " between $start and $end "; } public function test($test){ return $test; } private function huanwei($total) { $total = empty($total)?'0':trim($total.' '); if(!strstr($total,'.')){ $total=$total.'.00'; } $len = strlen($total); if ($len>7) { // 万 $total = (round(($total/10000),2)).'w'; } return $total; } private function cate($name) { $cate = M("Category"); $c = $cate->field('id')->where("status=1 and display=1 and name='$name'")->buildSql(); $ca = $cate->field('id')->where("status=1 and display=1 and pid=$c")->select(); foreach($ca as $c) { $d[]=$c['id']; } return "'".implode("','",$d)."'"; } /** * 投放平台数据自动汇总 * @author 鹿文学 */ public function launch_data() { $currentdate = mktime(0,0,0,date('m'),date('d'),date('Y')); $launchrecordmodel = D('LaunchRecord'); $launchdatamodel = D('LaunchData'); /* 获取统计数据最新时间,比较是否今天,是则不执行,否则继续 */ $duration = $launchdatamodel->get_new_line_time(); if($duration<$currentdate) { /* 判断时间是否为零,是则查询投放记录表,否则执行查找数据并插入 */ if($duration>0) { $result = $launchrecordmodel->auto_data(strtotime(date('Y-m-d',$duration))+86400,$currentdate-1); if(!empty($result)){ $launchdatamodel->addAll($result); } } else { $recordtime = $launchrecordmodel->get_old_line_time(); /* 判断时间是否存在且小于今天,是则执行查找数据并插入,否则不执行 */ if($recordtime<$currentdate && $recordtime>0) { $result = $launchrecordmodel->auto_data(strtotime(date('Y-m-d',$recordtime)),$currentdate-1); if(!empty($result)){ $launchdatamodel->addAll($result); } } } } } function set_first_analysis_data($start='',$end=''){ G('begin'); //ltv和分析数据总览 $this->first_ltv($start,$end); //分析数据游戏属性 $this->first_analysis1($start,$end); //分析数据推广员属性 $this->first_analysis2($start,$end); //分析数据游戏和推广员属性 $this->first_analysis3($start,$end); G('end'); // ...也许这里还有其他代码 // 进行统计区间 echo G('begin','end').'s'; echo "执行完毕"; } //LTV统计 private function first_ltv($start='',$end=''){ if(empty($start) || empty($end))exit('时间周期不正确'); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime($start),strtotime($end)); foreach ($datelist as $k => $v) { $ltv = M('ltv','tab_')->where(['time'=>$v])->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); //新增注册 $user = M('user','tab_')->field('id')->where(['register_time'=>$between])->select(); $data['new_count'] = count($user); $data['new_id'] = implode(',',array_column($user,'id')); //充值金额 $deposit = M('deposit','tab_')->field('sum(pay_amount) as money') ->where(['create_time'=>$between,'pay_status'=>1]) ->find(); $spend = M('spend','tab_')->field('sum(pay_amount) as money') ->where(['pay_time'=>$between,'pay_status'=>1,'pay_way'=>['gt',0]])->find(); $data['money'] = $deposit['money']+$spend['money']; //活跃玩家 $map['tab_user_login_record.login_time'] = $between; $map['register_time'] = array('lt',strtotime($v)); $active1 = M('user','tab_')->distinct(true)->field('tab_user.id') ->join('tab_user_login_record on tab_user_login_record.user_id=tab_user.id','inner') ->where($map)->order('tab_user.id asc')->select(); $active = array_merge($active1,$user); $data['active_count'] = count($active); $data['active_id'] = implode(',',array_column($active,'id')); $data['create_time'] = time(); M('ltv','tab_')->add($data); M('analysis','tab_')->add($data); $redis->set('analysis_'.$v,json_encode($data)); echo '执行时间:'.$v."
"; } } } private function first_analysis1($start='',$end=''){ set_time_limit(0); if(empty($start) || empty($end))exit('时间周期不正确'); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime($start),strtotime($end)); foreach ($datelist as $k => $v) { $where['time'] = $v; $where['game_id'] = array('gt',0); $where['promote_id'] = 0; $ltv = M('analysis','tab_')->where($where)->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); $map['tab_user_login_record.login_time'] = $between; $map['game_id'] = array('gt',0); //活跃玩家 $login_record = M('user_login_record','tab_')->distinct(true)->field('GROUP_CONCAT(distinct(user_id)) as user_id,game_id') ->where($map)->group('game_id')->order('game_id desc')->select(); foreach ($login_record as $key=>$value){ $analysis['time'] = $v; $analysis['game_id'] = $value['game_id']; $analysis['active_count'] = count(explode(',',$value['user_id'])); $analysis['active_id'] = $value['user_id']; //新增注册 $condition['register_time'] = $between; $condition['fgame_id'] = $value['game_id']; $user = M('user','tab_')->field('id')->where($condition)->select(); $news = array_column($user,'id'); $analysis['new_count'] = count($news); $analysis['new_id'] = implode(',',$news); $analysis['create_time'] = time(); M('analysis','tab_')->add($analysis); $redis->set('analysis_'.$v."_game_".$value['game_id'],json_encode($analysis)); } } } } private function first_analysis2($start='',$end=''){ set_time_limit(0); if(empty($start) || empty($end))exit('时间周期不正确'); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime($start),strtotime($end)); foreach ($datelist as $k => $v) { $where['time'] = $v; $where['game_id'] = 0; $where['promote_id'] = array('gt',0); $ltv = M('analysis','tab_')->where($where)->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); $map['tab_user_login_record.login_time'] = $between; $map['promote_id'] = array('gt',0); //活跃玩家 $login_record = M('user_login_record','tab_')->distinct(true)->field('GROUP_CONCAT(distinct(user_id)) as user_id,promote_id') ->where($map)->group('promote_id')->order('promote_id desc')->select(); foreach ($login_record as $key=>$value){ $analysis['time'] = $v; $analysis['promote_id'] = $value['promote_id']; $analysis['active_count'] = count(explode(',',$value['user_id'])); $analysis['active_id'] = $value['user_id']; //新增注册 $condition['register_time'] = $between; $condition['promote_id'] = $value['promote_id']; $user = M('user','tab_')->field('id')->where($condition)->select(); $news = array_column($user,'id'); $analysis['new_count'] = count($news); $analysis['new_id'] = implode(',',$news); $analysis['create_time'] = time(); M('analysis','tab_')->add($analysis); $redis->set('analysis_'.$v."_promote_".$value['promote_id'],json_encode($analysis)); } } } } private function first_analysis3($start='',$end=''){ set_time_limit(0); if(empty($start) || empty($end))exit('时间周期不正确'); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime($start),strtotime($end)); foreach ($datelist as $k => $v) { $where['time'] = $v; $where['game_id'] = array('gt',0); $where['promote_id'] = array('gt',0); $ltv = M('analysis','tab_')->where($where)->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); $map['tab_user_login_record.login_time'] = $between; $map['game_id'] = array('gt',0); $map['promote_id'] = array('gt',0); //活跃玩家 $login_record = M('user_login_record','tab_')->distinct(true)->field('GROUP_CONCAT(distinct(user_id)) as user_id,promote_id,game_id') ->where($map)->group('promote_id,game_id')->order('promote_id desc,game_id desc')->select(); foreach ($login_record as $key=>$value){ $analysis['time'] = $v; $analysis['promote_id'] = $value['promote_id']; $analysis['game_id'] = $value['game_id']; $analysis['active_count'] = count(explode(',',$value['user_id'])); $analysis['active_id'] = $value['user_id']; //新增注册 $condition['register_time'] = $between; $condition['promote_id'] = $value['promote_id']; $condition['fgame_id'] = $value['game_id']; $user = M('user','tab_')->field('id')->where($condition)->select(); $news = array_column($user,'id'); $analysis['new_count'] = count($news); $analysis['new_id'] = implode(',',$news); $analysis['create_time'] = time(); M('analysis','tab_')->add($analysis); $redis->set('analysis_'.$v."_promote_".$value['promote_id']."_game_".$value['game_id'],json_encode($analysis)); } } } } public function set_analysis_data(){ set_time_limit(0); echo date('Y-m-d H:i:s')."
"; //ltv统计和分析数据的总统计 $this->ltv(); //分析数据游戏属性 $this->analysis1(); //分析数据推广员属性 $this->analysis2(); //分析数据游戏和推广员属性 $this->analysis3(); echo date('Y-m-d H:i:s')."
"; echo "执行完毕"; } private function ltv(){ set_time_limit(0); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime('-7 day'),strtotime('-1 day')); foreach ($datelist as $k => $v) { $ltv = M('ltv','tab_')->where(['time'=>$v])->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); //新增注册 $user = M('user','tab_')->field('id')->where(['register_time'=>$between])->select(); $data['new_count'] = count($user); $data['new_id'] = implode(',',array_column($user,'id')); //充值金额 $deposit = M('deposit','tab_')->field('sum(pay_amount) as money') ->where(['create_time'=>$between,'pay_status'=>1]) ->find(); $spend = M('spend','tab_')->field('sum(pay_amount) as money') ->where(['pay_time'=>$between,'pay_status'=>1,'pay_way'=>['gt',0]])->find(); $data['money'] = $deposit['money']+$spend['money']; //活跃玩家 $map['tab_user_login_record.login_time'] = $between; $map['register_time'] = array('lt',strtotime($v)); $active1 = M('user','tab_')->distinct(true)->field('tab_user.id') ->join('tab_user_login_record on tab_user_login_record.user_id=tab_user.id','inner') ->where($map)->order('tab_user.id asc')->select(); $active = array_merge($active1,$user); $data['active_count'] = count($active); $data['active_id'] = implode(',',array_column($active,'id')); $data['create_time'] = time(); M('ltv','tab_')->add($data); M('analysis','tab_')->add($data); $redis->set('analysis_'.$v,json_encode($data)); } } } private function analysis1(){ set_time_limit(0); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime('-7 day'),strtotime('-1 day')); foreach ($datelist as $k => $v) { $where['time'] = $v; $where['game_id'] = array('gt',0); $where['promote_id'] = 0; $ltv = M('analysis','tab_')->where($where)->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); $map['tab_user_login_record.login_time'] = $between; $map['game_id'] = array('gt',0); //活跃玩家 $login_record = M('user_login_record','tab_')->distinct(true)->field('GROUP_CONCAT(distinct(user_id)) as user_id,game_id') ->where($map)->group('game_id')->order('game_id desc')->select(); foreach ($login_record as $key=>$value){ $analysis['time'] = $v; $analysis['game_id'] = $value['game_id']; $analysis['active_count'] = count(explode(',',$value['user_id'])); $analysis['active_id'] = $value['user_id']; //新增注册 $condition['register_time'] = $between; $condition['fgame_id'] = $value['game_id']; $user = M('user','tab_')->field('id')->where($condition)->select(); $news = array_column($user,'id'); $analysis['new_count'] = count($news); $analysis['new_id'] = implode(',',$news); $analysis['create_time'] = time(); M('analysis','tab_')->add($analysis); $redis->set('analysis_'.$v."_game_".$value['game_id'],json_encode($analysis)); } } } } private function analysis2(){ set_time_limit(0); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime('-7 day'),strtotime('-1 day')); foreach ($datelist as $k => $v) { $where['time'] = $v; $where['game_id'] = 0; $where['promote_id'] = array('gt',0); $ltv = M('analysis','tab_')->where($where)->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); $map['tab_user_login_record.login_time'] = $between; $map['promote_id'] = array('gt',0); //活跃玩家 $login_record = M('user_login_record','tab_')->distinct(true)->field('GROUP_CONCAT(distinct(user_id)) as user_id,promote_id') ->where($map)->group('promote_id')->order('promote_id desc')->select(); foreach ($login_record as $key=>$value){ $analysis['time'] = $v; $analysis['promote_id'] = $value['promote_id']; $analysis['active_count'] = count(explode(',',$value['user_id'])); $analysis['active_id'] = $value['user_id']; //新增注册 $condition['register_time'] = $between; $condition['promote_id'] = $value['promote_id']; $user = M('user','tab_')->field('id')->where($condition)->select(); $news = array_column($user,'id'); $analysis['new_count'] = count($news); $analysis['new_id'] = implode(',',$news); $analysis['create_time'] = time(); M('analysis','tab_')->add($analysis); $redis->set('analysis_'.$v."_promote_".$value['promote_id'],json_encode($analysis)); } } } } private function analysis3(){ set_time_limit(0); $redis = new Redis(['host'=>'127.0.0.1','port'=>6379],[]); $keys = $redis->keys('analysis_*'); if(!$keys){ get_redis_data(); } $datelist = get_date_list(strtotime('-7 day'),strtotime('-1 day')); foreach ($datelist as $k => $v) { $where['time'] = $v; $where['game_id'] = array('gt',0); $where['promote_id'] = array('gt',0); $ltv = M('analysis','tab_')->where($where)->field('id')->find(); if(!$ltv){ $data['time'] = $v; $between = array('between',array(strtotime($v),strtotime($v)+86399)); $map['tab_user_login_record.login_time'] = $between; $map['game_id'] = array('gt',0); $map['promote_id'] = array('gt',0); //活跃玩家 $login_record = M('user_login_record','tab_')->distinct(true)->field('GROUP_CONCAT(distinct(user_id)) as user_id,promote_id,game_id') ->where($map)->group('promote_id,game_id')->order('promote_id desc,game_id desc')->select(); foreach ($login_record as $key=>$value){ $analysis['time'] = $v; $analysis['promote_id'] = $value['promote_id']; $analysis['game_id'] = $value['game_id']; $analysis['active_count'] = count(explode(',',$value['user_id'])); $analysis['active_id'] = $value['user_id']; //新增注册 $condition['register_time'] = $between; $condition['promote_id'] = $value['promote_id']; $condition['fgame_id'] = $value['fgame_id']; $user = M('user','tab_')->field('id')->where($condition)->select(); $news = array_column($user,'id'); $analysis['new_count'] = count($news); $analysis['new_id'] = implode(',',$news); $analysis['create_time'] = time(); M('analysis','tab_')->add($analysis); $redis->set('analysis_'.$v."_promote_".$value['promote_id']."_game_".$value['game_id'],json_encode($analysis)); } } } } //根据时间统计玩家充值 public function userPlayDataCount($time = '') { if ($time == '') { $time = strtotime(date('Y-m-d 00:00:00', time() - (3600 * 24))); } else { $time = strtotime(date('Y-m-d 00:00:00', strtotime($time))); } $res = M('user_play_data_count', 'tab_')->where(array('create_time' => $time))->find(); if (empty($res)) { $map['pay_time'] = ['between', [$time, strtotime(date('Y-m-d 23:59:59', $time))]]; $this->userPlayDataCountByMap($map); } } //根据时间统计玩家充值--初始化 public function userPlayDataCountInitial() { $res = M('user_play_data_count', 'tab_')->order('id asc')->find(); if (empty($res)) { ini_set('memory_limit','500M'); $time = strtotime(date('Y-m-d 00:00:00', time())); $map['pay_time'] = ['lt', $time]; $this->userPlayDataCountByMap($map); echo '初始化成功'; } else { echo '表存在记录,无法初始化'; } } private function userPlayDataCountByMap($map) { if (isset($map['pay_time'])) { $map['pay_status'] = 1; $map['game_player_id'] = ['gt', 0]; $map['server_id'] = ['gt', 0]; $field = 'FROM_UNIXTIME(pay_time, "%Y-%m-%d") as day,promote_id,user_id,game_id,server_id,game_player_id,sum(pay_amount) as recharge_cost,count(id) as recharge_count'; $spendData = M('spend', 'tab_')->field($field) ->where($map) ->group('day,game_player_id,server_id,game_id,user_id,promote_id') ->select(); if (!empty($spendData)) { $data = []; foreach ($spendData as &$list) { $data[] = [ 'promote_id' => $list['promote_id'], 'user_id' => $list['user_id'], 'game_id' => $list['game_id'], 'server_id' => $list['server_id'], 'role_id' => $list['game_player_id'], 'recharge_cost' => $list['recharge_cost'], 'recharge_count' => $list['recharge_count'], 'create_time' => strtotime($list['day']), ]; unset($list); } unset($spendData); M('user_play_data_count', 'tab_')->addAll($data); } } } //用户推广员数据刷新 public function updateUserPromoteAccount() { $map['promote_id'] = ['gt', 0]; $map['_string'] = "promote_account = '' or promote_account = '自然注册' or promote_account = '官方渠道' or promote_account is NULL"; $userModel = M('user', 'tab_'); $userPlayModel = M('user_play', 'tab_'); $userPlayInfoModel = M('user_play_info', 'tab_'); $userData = $userModel->field('id,promote_id')->where($map)->select(); $userPlayData = $userPlayModel->field('id,promote_id')->where($map)->select(); $userPlayInfoData = $userPlayInfoModel->field('id,promote_id')->where($map)->select(); $promoteData = []; $userRet = $this->updateUserPromoteAccountSql($userModel, $userData, $promoteData); $userSuccess = $userRet['success']; $userError = $userRet['error']; $userErrorData = empty($userRet['error_data']) ? '' : implode(',', $userRet['error_data']); $promoteData = $userRet['promote_data']; $userAll = count($userData); unset($userData); $userPlayRet = $this->updateUserPromoteAccountSql($userPlayModel, $userPlayData, $promoteData); $userPlaySuccess = $userPlayRet['success']; $userPlayError = $userPlayRet['error']; $userPlayErrorData = empty($userPlayRet['error_data']) ? '' : implode(',', $userPlayRet['error_data']); $promoteData = $userPlayRet['promote_data']; $userPlayAll = count($userPlayData); unset($userPlayData); $userPlayInfoRet = $this->updateUserPromoteAccountSql($userPlayInfoModel, $userPlayInfoData, $promoteData); $userPlayInfoSuccess = $userPlayInfoRet['success']; $userPlayInfoError = $userPlayInfoRet['error']; $userPlayInfoErrorData = empty($userPlayInfoRet['error_data']) ? '' : implode(',', $userPlayInfoRet['error_data']); $promoteData = $userPlayInfoRet['promote_data']; $userPlayInfoAll = count($userPlayInfoData); unset($userPlayInfoData); echo "tab_user:all--{$userAll} success--{$userSuccess} error--{$userError} error_ids--{$userErrorData}"; echo '
'; echo "tab_user_play:all--{$userPlayAll} success--{$userPlaySuccess} error--{$userPlayError} error_ids--{$userPlayErrorData}"; echo '
'; echo "tab_user_play_info:all--{$userPlayInfoAll} success--{$userPlayInfoSuccess} error--{$userPlayInfoError} error_ids--{$userPlayInfoErrorData}"; echo '
'; } private function updateUserPromoteAccountSql($model, $data = [], $promoteData = []) { $success = 0; $error = 0; $errorData = []; foreach ($data as &$list) { if (isset($promoteData[$list['promote_id']])) { $promoteAccount = $promoteData[$list['promote_id']]; } else { $promoteAccount = M('promote', 'tab_')->where(array('id' => $list['promote_id']))->getField('account'); $promoteAccount = empty($promoteAccount) ? '未知推广员' : $promoteAccount; $promoteData[$list['promote_id']] = $promoteAccount; } $save['id'] = $list['id']; $save['promote_account'] = $promoteAccount; $res = $model->save($save); if ($res === false) { $error++; $errorData = $list['id']; } else { $success++; } unset($list); } $ret = [ 'success' => $success, 'error' => $error, 'error_data' => $errorData, 'promote_data' => $promoteData, ]; return $ret; } //会长周结 public function promoteWithdrawWeekly() { $this->promoteWithdraw(1); } //会长月结 public function promoteWithdrawPerMonth() { $this->promoteWithdraw(2); } //会长提现 $settlement 1-周结算 2-月结算 private function promoteWithdraw($settlement = 1) { $map['level'] = 1; $map['ver_status'] = 1; $map['settlement_type'] = $settlement; $promotes = M('promote', 'tab_')->field('id, account, chain')->where($map)->select(); $success = 0; $error_withdraw = 0; $error_spend = 0; $error_balance = 0; if (!empty($promotes)) { foreach ($promotes as $promote) { $result = $this->promoteWithdrawByPromote($promote); switch ($result) { case -2: $error_balance++; break; case -1: $error_spend++; break; case 0: $error_withdraw++; break; case 1: $success++; break; } } } echo "success:{$success} error_withdraw:{$error_withdraw} error_spend:{$error_spend} error_balance:{$error_balance}"; } private function promoteWithdrawByPromote($promote) { $promoteMap['chain'] = ['like', "{$promote['chain']}{$promote['id']}/%"]; $promoteIds = M('promote', 'tab_')->where($promoteMap)->getField('id', true); $promoteIds[] = $promote['id']; $settlementEndTime = strtotime(date('Y-m-d')) - 1; $spendMap['pay_status'] = 1; $spendMap['selle_status'] = 0; $spendMap['promote_id'] = ['in', $promoteIds]; $spendMap['pay_time'] = ['elt', $settlementEndTime]; $spendModel = M('spend', 'tab_'); $balance = $spendModel->field("sum(if(selle_ratio > 0, pay_amount * selle_ratio, 0)) as balance") ->where($spendMap) ->find()['balance']; $balance = bcdiv($balance, 100, 2); if ($balance < 100) { return -2;//余额不足 } $thisTime = time(); $add['sum_money'] = $balance; $add['promote_id'] = $promote['id']; $add['promote_account'] = $promote['account']; $add['create_time'] = $thisTime; $add['status'] = 0; $add['widthdraw_number'] = D('withdraw')->produceWithdrawNumber(); $add['settlement_begin_time'] = 0; $add['settlement_end_time'] = $settlementEndTime; $add['spend_ids'] = ''; $add['op_id'] = 0; $add['op_type'] = 3; $add['last_op_id'] = $add['op_id']; $add['last_op_type'] = 3; M()->startTrans();//开启事物 $withdrawId = D('withdraw')->add($add); if (!$withdrawId) { M()->rollback();//事物回滚 return 0;//提现失败 } $save['selle_status'] = 1; $save['selle_time'] = $thisTime; $save['withdraw_id'] = $withdrawId; $res = $spendModel->where($spendMap)->save($save); if ($res === false) { D('withdraw')->delete($withdrawId); M()->rollback();//事物回滚 return -1; } M()->commit();//事物提交 return 1; } }