title = "概览"; $this->p_title = "管理中心"; $this->p_url = U('Stats/overview'); parent::_initialize(); // TODO: Change the autogenerated stub } /** * 概览 * author: xmy 280564871@qq.com */ public function overview(){ $UserPlay = new UserPlayModel(); //累计玩家 $total_player = $UserPlay->getTotalPlayerOfOpen(['g.developers'=>UID]); $this->assign("total_player",$total_player); //付费玩家 $Spend = new SpendModel(); $spend_user = $Spend->countSpendUserOfOpen(['g.developers'=>UID,'s.pay_status'=>1]); $this->assign("spend_user",$spend_user); //累计流水 $total_spend = $Spend->totalSpend(["g.developers"=>UID]); $this->assign("total_spend",$total_spend); //实时活跃 $today = strtotime("today"); $today_active_user = $UserPlay->getTotalPlayerOfOpen(["g.developers"=>UID,'p.play_time'=>['between',[$today,$today+86400-1]]]); $this->assign("today_active_user",$today_active_user); //实时流水 $today_spend = $Spend->totalSpend(["g.developers"=>UID,'s.pay_time'=>['between',[$today,$today+86400-1]]]); $this->assign("today_spend",$today_spend); //游戏数量 $Game = new GameModel(); $game_num = $Game->getGameNum(['developers'=>UID]); $this->assign("game_num",$game_num); //已上线 $online_game = $Game->getGameNum(['developers'=>UID,'online_status'=>1,'apply_status'=>1]); $this->assign("online_game",$online_game); //已下线 $down_game = $Game->getGameNum(['developers'=>UID,'online_status'=>0,'apply_status'=>1]); $this->assign("down_game",$down_game); //审核中 $check_game = $Game->getGameNum(['developers'=>UID,'apply_status'=>0]); $this->assign("check_game",$check_game); //未通过 $reject_game = $Game->getGameNum(['developers'=>UID,'apply_status'=>2]); $this->assign("reject_game",$reject_game); //数据详情 //$this->detail(); $this->indicators(); $this->display(); } /** * 关键指标 * @author 鹿文学 */ public function indicators() { $start = empty(I('time_start')) ? strtotime("today") - 6 * 86400 : strtotime(I('time_start')); $end = empty(I("time_end")) ? strtotime("today") : strtotime(I('time_end')); $start_str = date("Y-m-d",$start); $end_str = date("Y-m-d",$end); $game_id = I('post.game_id'); $Record = new UserLoginRecordModel(); //新玩家 $detail['add_user'] = $data['newUsers'] = $Record->get_news_player($start_str,$end_str, UID, $game_id); //活跃玩家 $map['d.time'] = ['between',[$start_str,$end_str]]; $detail['active_user'] = $data['activeUsers'] = $Record->getActivePlayer($map,UID,$game_id); //老用户 $data['oldUsers'] = []; //付费玩家 $Spend = new SpendModel(); $detail['payer_num'] = $data['payUsers'] = $Spend->getPayerNum($map,UID,$game_id); //新付费玩家 $detail['new_payer_num'] = $data['newPayUsers'] = $Spend->getNewPayerNum($start_str,$end_str,UID,$game_id); //每日流水 $s_map = $map; $s_map['s.game_id'] = $game_id; $detail['spend'] = $data['usersIncome'] = $Spend->getOpenSpend($map,UID,$game_id); //ARPU $data['usersArpu'] = []; //ARPPU $data['usersArppu'] = []; //付费率 $data['usersPayRate'] = []; //老付费玩家 $data['oldPayUsers'] = []; //1 3 7日留存 $keep_user = $Record->get_keep_player($start,$end,UID,$game_id,[1,3,7]); $detail['keep_user'] = $keep_user['1RatentionRate']; $data = array_merge($data,$keep_user); $res = []; foreach ($data as $key=>$value){ $value = array_column($value,'num'); $i = 0; for ($time = $start; $time <= $end; $time += 86400) { $time_k = date("Y-m-d",$time); switch ($key){ case "oldUsers"://老用户 $res[$key][$time_k] = !is_nan($res['activeUsers'][$time_k] - $res['newUsers'][$time_k])? $res['activeUsers'][$time_k] - $res['newUsers'][$time_k]:0; break; case "usersArpu"://ARPU $res[$key][$time_k] = !is_nan(round($res['usersIncome'][$time_k] / $res['activeUsers'][$time_k],2))?round($res['usersIncome'][$time_k] / $res['activeUsers'][$time_k],2):0; break; case "usersArppu"://ARPU $res[$key][$time_k] = !is_nan(round($res['usersIncome'][$time_k] / $res['payUsers'][$time_k],2))?round($res['usersIncome'][$time_k] / $res['payUsers'][$time_k],2):0; break; case "usersPayRate"://付费率 $res[$key][$time_k] = !is_nan(round($res['payUsers'][$time_k] / $res['activeUsers'][$time_k]*100,2))?round($res['payUsers'][$time_k] / $res['activeUsers'][$time_k]*100,2):0; break; case "oldPayUsers"://老付费玩家 $res[$key][$time_k] = !is_nan($res['payUsers'][$time_k] - $res['newPayUsers'][$time_k])?$res['payUsers'][$time_k] - $res['newPayUsers'][$time_k]:0; break; case "1RatentionRate": $res[$key][$time_k] =!is_nan(round($value[$i] / $res['newUsers'][$time_k] * 100,2))?round($value[$i++] / $res['newUsers'][$time_k] * 100,2):0; break; case "3RatentionRate": $res[$key][$time_k] = !is_nan(round($value[$i] / $res['newUsers'][$time_k] * 100,2))?round($value[$i++] / $res['newUsers'][$time_k] * 100,2):0; break; case "7RatentionRate": $res[$key][$time_k] = !is_nan(round($value[$i] / $res['newUsers'][$time_k] * 100,2))? round($value[$i++] / $res['newUsers'][$time_k] * 100,2):0; break; default: $res[$key][$time_k] = $value[$i++]; } } } $this->assign("json_data",json_encode($res)); $this->data_detail_list($start_str,$end_str,$detail,$game_id); } /** * 详细数据 * @author 鹿文学 */ public function data_detail_list($last_week,$today,$data,$game_id='') { $Spend = new SpendModel(); //累计付费玩家 $data['payer_num_total'] = $Spend->getTotalPayerNum($last_week,$today,UID); //详情列表数据 foreach ($data as $key => $value){ foreach ($value as $k => $v){ $time = date("Y-m-d",strtotime($today)-(count($value)-$k-1)*86400); $result[$time][$key] = $v['num']; } } krsort($result); $this->assign('detail_data_lists',$result); } /* public function data_detail($last_week,$today) { //新增玩家 $map['d.time'] = ['between',[$last_week ,$today]]; $UserPlay = new UserLoginRecordModel(); $data['add_user'] = $UserPlay->get_news_player($last_week,$today,UID); //活跃玩家 $data['active_user'] = $UserPlay->getActivePlayer($map,UID); //老用户 // $data['old_user'] = $UserPlay->getOldPlayer($last_week,$today,UID); //1日留存率 $data['keep_user'] = $UserPlay->getKeepPlayer($last_week,$today,UID)["1RatentionRate"]; //流水 $Spend = new SpendModel(); $data['spend'] = $Spend->getOpenSpend($map,UID); //付费玩家 $data['payer_num'] = $Spend->getPayerNum($map,UID); //新付费玩家 $data['new_payer_num'] = $Spend->getNewPayerNum($last_week,$today,UID); //累计付费玩家 $data['payer_num_total'] = $Spend->getTotalPayerNum($last_week,$today,UID); //详情列表数据 foreach ($data as $key => $value){ foreach ($value as $k => $v){ $time = date("Y-m-d",strtotime("today")-(6-$k)*86400); $result[$time][$key] = $v['num']; } } krsort($result); $this->assign('detail_data_lists',$result); } */ public function detail(){ //最近七天 $last_week = date("Y-m-d",strtotime("today")-6*86400); $today = date("Y-m-d",strtotime("today")); //新增玩家 $map['d.time'] = ['between',[$last_week ,$today]]; $UserPlay = new UserLoginRecordModel(); $data['add_user'] = $UserPlay->getAddPlayer($last_week,$today,UID); //活跃玩家 $data['active_user'] = $UserPlay->getActivePlayer($map,UID); //老用户 // $data['old_user'] = $UserPlay->getOldPlayer($last_week,$today,UID); //1日留存率 $data['keep_user'] = $UserPlay->getKeepPlayer($last_week,$today,UID)["1RatentionRate"]; //流水 $Spend = new SpendModel(); $data['spend'] = $Spend->getOpenSpend($map,UID); //付费玩家 $data['payer_num'] = $Spend->getPayerNum($map,UID); //新付费玩家 $data['new_payer_num'] = $Spend->getNewPayerNum($last_week,$today,UID); //累计付费玩家 $data['payer_num_total'] = $Spend->getTotalPayerNum($last_week,$today,UID); //详情列表数据 foreach ($data as $key => $value){ foreach ($value as $k => $v){ $time = date("Y-m-d",strtotime("today")-(6-$k)*86400); $result[$time][$key] = $v['num']; } } krsort($result); $this->assign('detail_data_lists',$result); $this->chart(); } /** * 图表 * author: xmy 280564871@qq.com */ public function chart() { $start = empty(I('time_start')) ? strtotime("today") - 6 * 86400 : strtotime(I('time_start')); $end = empty(I("time_end")) ? strtotime("today") : strtotime(I('time_end')); $start_str = date("Y-m-d",$start); $end_str = date("Y-m-d",$end); $game_id = I('post.game_id'); $Record = new UserLoginRecordModel(); //新玩家 $data['newUsers'] = $Record->getAddPlayer($start_str,$end_str, UID, $game_id); //活跃玩家 $map['d.time'] = ['between',[$start_str,$end_str]]; $data['activeUsers'] = $Record->getActivePlayer($map,UID,$game_id); //老用户 $data['oldUsers'] = []; //付费玩家 $Spend = new SpendModel(); $data['payUsers'] = $Spend->getPayerNum($map,UID,$game_id); //新付费玩家 $data['newPayUsers'] = $Spend->getNewPayerNum($start_str,$end_str,UID,$game_id); //每日流水 $s_map = $map; $s_map['s.game_id'] = $game_id; $data['usersIncome'] = $Spend->getOpenSpend($map,UID); //ARPU $data['usersArpu'] = []; //ARPPU $data['usersArppu'] = []; //付费率 $data['usersPayRate'] = []; //老付费玩家 $data['oldPayUsers'] = []; //1 3 7日留存 $keep_user = $Record->getKeepPlayer($start_str,$end_str,UID,$game_id,[1,3,7]); $data = array_merge($data,$keep_user); $res = []; foreach ($data as $key=>$value){ $value = array_column($value,'num'); $i = 0; for ($time = $start; $time <= $end; $time += 86400) { $time_k = date("Y-m-d",$time); switch ($key){ case "oldUsers"://老用户 $res[$key][$time_k] = !is_nan($res['activeUsers'][$time_k] - $res['newUsers'][$time_k])? $res['activeUsers'][$time_k] - $res['newUsers'][$time_k]:0; break; case "usersArpu"://ARPU $res[$key][$time_k] = !is_nan(round($res['usersIncome'][$time_k] / $res['activeUsers'][$time_k],2))?round($res['usersIncome'][$time_k] / $res['activeUsers'][$time_k],2):0; break; case "usersArppu"://ARPU $res[$key][$time_k] = !is_nan(round($res['usersIncome'][$time_k] / $res['payUsers'][$time_k],2))?round($res['usersIncome'][$time_k] / $res['payUsers'][$time_k],2):0; break; case "usersPayRate"://付费率 $res[$key][$time_k] = !is_nan(round($res['payUsers'][$time_k] / $res['activeUsers'][$time_k]*100,2))?round($res['payUsers'][$time_k] / $res['activeUsers'][$time_k]*100,2):0; break; case "oldPayUsers"://老付费玩家 $res[$key][$time_k] = !is_nan($res['payUsers'][$time_k] - $res['newPayUsers'][$time_k])?$res['payUsers'][$time_k] - $res['newPayUsers'][$time_k]:0; break; case "1RatentionRate": $res[$key][$time_k] =!is_nan(round($value[$i++] / $res['newUsers'][$time_k] * 100,2))?round($value[$i++] / $res['newUsers'][$time_k] * 100,2):0; break; case "3RatentionRate": $res[$key][$time_k] = !is_nan(round($value[$i++] / $res['newUsers'][$time_k] * 100,2))?round($value[$i++] / $res['newUsers'][$time_k] * 100,2):0; break; case "7RatentionRate": $res[$key][$time_k] = !is_nan(round($value[$i++] / $res['newUsers'][$time_k] * 100,2))? round($value[$i++] / $res['newUsers'][$time_k] * 100,2):0; break; default: $res[$key][$time_k] = $value[$i++]; } } } $this->assign("json_data",json_encode($res)); } public function retention($p=1){ $this->title = "留存分析"; $start = empty(I('time_start')) ? strtotime("today") - 6 * 86400 : strtotime(I('time_start')); $end = empty(I("time_end")) ? strtotime("today") : strtotime(I('time_end')); $game_id = I('game_id'); $start_str = date("Y-m-d",$start); $end_str = date("Y-m-d",$end); $Record = new UserLoginRecordModel(); //留存 $day = [1,2,3,7,10,14,15,30]; //$keep = $Record->getKeepPlayer($start_str,$end_str,UID,$game_id,$day); $keep = $Record->get_keep_player($start,$end,UID,$game_id,$day); //新增玩家 //$data['newUsers'] = $Record->getAddPlayer($start_str,$end_str, UID, $game_id); $data['newUsers'] = $Record->get_news_player($start_str,$end_str, UID, $game_id); $data = array_merge($data,$keep); foreach ($data as $key=>$value){ $value = array_column($value,'num'); $i = 0; for ($time = $start; $time <= $end; $time += 86400) { $time_k = date("Y-m-d",$time); if($key == "newUsers"){ //表格数据显示 $result[$time_k][$key] = $value[$i]; //统计图 $res[$key][$time_k] = $value[$i]; }else{ $key = str_replace("RatentionRate","",$key); //表格数据显示 $result[$time_k][$key] = round($value[$i] / $res['newUsers'][$time_k] * 100, 2); //统计图 $res[$key][$time_k] = $result[$time_k][$key]; } $i++; } } krsort($result); $this->assign("json_data",json_encode($res)); $this->assign("data",$result); $this->display(); } public function loss(){ $this->title = "流失分析"; $start=get_lastweek_name(6); $end=date('Y-m-d'); $this->assign('start',$start); $this->assign('end',$end); $result=$this->loss_pic($_REQUEST); foreach ($result['day'] as $key => $value) { $res['lossplayer']['loss'][$value]=$result['loss_count'][$key]; $res['lossplayer']['lossrate'][$value]=$result['loss_rate'][$key]; } $money_arr=array( ">¥2000","¥1000~2000","¥600~1000","¥200~600","¥100~200","¥40~100","¥20~40","¥10~20","¥2~$10","<¥2", ); foreach ($money_arr as $key => $value) { $res['lossmoney'][$value]=$result['loss_money'][$key]; } $times_arr=array( ">50次","41~50次","31~40次","21~30次","11~20次","6~10次","5次","4次","3次","2次","1次","未付费", ); foreach ($times_arr as $key => $value) { $res['losstimes'][$value]=$result['loss_times'][$key]; } $this->assign("json_data",json_encode($res)); $this->display(); } //流失率分析 public function loss_pic($para){ if(isset($para['time_start'])&&isset($para['time_end'])&&$para['time_start']!==null&&$para['time_end']!==null){ $dd=prDates($para['time_start'],$para['time_end']); $day=$dd; $this->assign('tt',array_chunk($dd,1)); }else{ $defTimeE=date("Y-m-d",time()); $defTimeS=date("Y-m-d",time()-24*60*60*6); $day=$this->every_day(7); $dd=prDates($defTimeS,$defTimeE); } if(isset($para['game_id'])){ $map['r.game_id']=$para['game_id']; $map1['r.game_id']=$para['game_id']; } if(isset($para['channel_id'])&&$para['channel_id']!=""){ if($para['channel_id']==2){ $d=7; }else{ $d=3; } }else{ $d=3; } $limitI=count($dd); $Record = new UserLoginRecordModel(); for($i=0;$i<$limitI;$i++){ $start=$this->get_time($dd[$i],$d); $end=$start+24*60*60-1; $map['login_time']=array('between',array($start,$end)); $map['developers']=UID; $logins=$Record->getPlayers($map,UID); if($logins==null){ $loss=null; }else{ $loss=null; foreach ($logins as $key => $value) { $start=date("Y-m-d", $value['login_time']+24*60*60); $start=$this->get_time($start,0); $end=$start+24*60*60*$d; $map1['login_time']=array('between',array($start,$end)); $map1['user_id']=$value['user_id']; $map1['developers']=UID; $result1=$Record->findPlayer($map1); if($result1==null){ $loss[]=$logins[$key]; } } } if($loss!=null){ $loser[]=$loss; } $loss_count[]=count($loss); $loss_rate[]=count($loss)/count($logins)*100?sprintf("%.2f",count($loss)/count($logins)*100):0; } foreach ($loser as $key => $value) { foreach ($value as $k => $v) { $losers[]=$v['user_id']; } } $data2=$this->loss_pic2($losers); $data3=$this->loss_pic3($losers); $result['day']=$day; $result['loss_count']=$loss_count; $result['loss_rate']=$loss_rate; $result['loss_money']=$data2; $result['loss_times']=$data3; return $result; } /** * 流失用户消费金额分析,包括不同等级的人数和所占比例 * @param [type] $data [description] * @return [type] [description] */ function loss_pic2($data){ $Spend=new SpendModel(); foreach ($data as $key => $value) { $list[$key]['user_id']=$value; $list[$key]['amount']=$Spend->totalSpend($list[$key]); } foreach ($list as $k => $v) { if($v['amount']<2){ $two[]=$v; }elseif($v['amount']<10){ $ten[]=$v; }elseif($v['amount']<20){ $twenty[]=$v; }elseif($v['amount']<40){ $forty[]=$v; }elseif($v['amount']<100){ $hundred[]=$v; }elseif($v['amount']<200){ $thundred[]=$v; }elseif($v['amount']<600){ $shundred[]=$v; }elseif($v['amount']<1000){ $thousand[]=$v; }elseif($v['amount']<2000){ $tthousand[]=$v; }else{ $thousands[]=$v; } } $result=[count($thousands),count($tthousand),count($thousand),count($shundred),count($thundred),count($hundred),count($forty),count($twenty),count($ten),count($two)]; return $result; } /** * 流失用户消费次数分析,包括不同次数所占人数和比例 * @param [type] $data [description] * @return [type] [description] */ public function loss_pic3($data){ $Spend=new SpendModel(); foreach ($data as $key => $value) { $list[$key]['user_id']=$value; $list[$key]['count']=$Spend->totalSpendTimes($list[$key]); } foreach ($list as $k => $v) { if($v['count']==0){ $zero[]=$v; }elseif($v['count']==1){ $one[]=$v; }elseif($v['count']==2){ $two[]=$v; }elseif($v['count']==3){ $three[]=$v; }elseif($v['count']==4){ $four[]=$v; }elseif($v['count']==5){ $five[]=$v; }elseif($v['count']<11){ $ten[]=$v; }elseif($v['count']<21){ $twenty[]=$v; }elseif($v['count']<31){ $thirty[]=$v; }elseif($v['count']<41){ $forty[]=$v; }elseif($v['count']<51){ $fifty[]=$v; }else{ $fiftys[]=$v; } } $result=[count($fiftys),count($fifty),count($forty),count($thirty),count($twenty),count($ten),count($five),count($four),count($three),count($two),count($one),count($zero)]; return $result; } /** * [get_time 通过日期获得时间戳] * @param [type] $date [description] * @return [type] [int] */ private function get_time($date,$d){ $date= explode("-",$date); $year=$date[0]; $month=$date[1]; $day=$date[2]; $start=mktime(0,0,0,$month,$day,$year)-$d*24*60*60; return $start; } /** * [every_day 获取日期] * @param integer $m [description] * @return [type] [array] */ private function every_day($m=7){ $time=array(); for ($i=$m-1; $i >=0 ; $i--) { $time[]=date('Y-m-d',mktime(0,0,0,date('m'),date('d')-$i,date('Y'))); } return $time; } }