*/ class StatController extends ThinkController { public function user($p=1) { $page = intval($p); $page = $page ? $page : 1; //默认显示第一页数据 if(isset($_REQUEST['row'])) {$row = $_REQUEST['row'];}else{$row = 10;} if(is_numeric($_REQUEST['game_id']) && $_REQUEST['game_id']>0) { $game_id = I('game_id',''); $gamesource = get_source_from_game($game_id); } else { $gamesource = '全部'; } if(is_numeric($_REQUEST['promote_id'])) { $promote_id = I('promote_id',0); $promoteaccount = get_promote_name($promote_id); } else { $promoteaccount = '全部'; } $list = D('user')->user($promote_id,$game_id); $count = count($list); $data = array_slice($list,($page-1)*$row,$row,true); file_put_contents(RUNTIME_PATH.'/access_data_user.txt',json_encode($list)); $page = set_pagination($count,$row); if($page) {$this->assign('_page', $page);} $this->checkListOrCountAuthRestMap($map,[]); $this->meta_title = '用户统计'; $this->assign('data',$data); $this->assign('game_source',$gamesource); $this->assign('promote_account',$promoteaccount); $this->display(); } public function user1($p=1) { $page = intval($p); $page = $page ? $page : 1; //默认显示第一页数据 if(isset($_REQUEST['row'])) {$row = $_REQUEST['row'];}else{$row = 10;}//10; $start = $_GET['start']= I('start',date('Y-m-d',strtotime('-2 day'))); $end = I('end',date('Y-m-d',strtotime('-1 day'))); $end = strtotime($end)>=strtotime(date('Y-m-d'))?date('Y-m-d',strtotime('-1 day')):$end; $_GET['end'] = $end; if(is_numeric($_REQUEST['game_id']) && $_REQUEST['game_id']>0) { $game_id = I('game_id',''); $gamesource = get_source_from_game($game_id); } else { $gamesource = '全部'; } if(is_numeric($_REQUEST['promote_id'])) { $promote_id = I('promote_id',0); $promoteaccount = get_promote_name($promote_id); } else { $promoteaccount = '全部'; } $list = D('user')->user1(strtotime($start),strtotime($end),$promote_id,$game_id); $count = count($list); $data = array_slice($list,($page-1)*$row,$row,true); file_put_contents(RUNTIME_PATH.'/access_data_user.txt',json_encode($list)); if($count > $row){ $page = new \Think\Page($count, $row); $page->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%'); $this->assign('_page', $page->show()); } $this->meta_title = '用户统计'; $this->assign('data',$data); $this->assign('game_source',$gamesource); $this->assign('promote_account',$promoteaccount); $this->display(); } public function multisort($records, $column, $type = 'asc') { $length = count($records); for ($i = 0; $i < $length; $i ++) { for ($j = $i + 1; $j < $length; $j ++) { if ($type == 'asc') { if ($records[$i][$column] > $records[$j][$column]) { $temp = $records[$i]; $records[$i] = $records[$j]; $records[$j] = $temp; } } else if ($type == 'desc') { if ($records[$i][$column] < $records[$j][$column]) { $temp = $records[$i]; $records[$i] = $records[$j]; $records[$j] = $temp; } } } } return $records; } public function userretention() { $this->meta_title = '留存统计'; $start = I('start', date('Y-m-d',strtotime('-7 day'))); $end = empty(I('end')) ? time_format(time(),'Y-m-d') : I('end'); $dataOrder = I('data_order', ''); $gameId = I('game_id', 0); $promoteId = I('promote_id', 0); $orderType = 'asc'; $orderColumn = 'date'; if ($dataOrder != '') { $dataOrder = explode(',', $dataOrder); $orderType = $dataOrder[1]; $orderColumn = $dataOrder[0]; } $status = true; $data = false; $error = ''; if ($gameId == 0) { $error = '请选择游戏!'; $status = false; } $startTime = strtotime($start . ' 00:00:00'); $endTime = strtotime($end . ' 23:59:59') + 1; if ((($endTime - $startTime)/(24*3600)) > 31) { $error = '时间间隔不能超过31天'; $status = false; } if ($status) { $client = new Client([ 'base_uri' => C('TASK_URL'), 'timeout' => 10.0, ]); $response = $client->post('/statistics/player-retention', [ 'verify' => false, 'form_params' => [ 'start_time' => $start, 'end_time' => $end, 'promote_id' => I('promote_id', 0), 'game_id' => $gameId, ] ]); $result = (string)$response->getBody(); $result = json_decode($result, true); if (!$result) { $this->assign('error', '数据请求异常!'); } $data = $result['data']['records']; $dayList = [1, 2, 3, 4, 5, 6, 7, 15, 30]; $gameName = get_game_name($gameId); $promoteName = '全部'; if ($promoteId) { $promoteName = get_promote_account($promoteId); } foreach ($data as $key => $item) { $item['promote_name'] = $promoteName; $item['game_name'] = $gameName; foreach ($dayList as $day) { if ($item['register_count'] > 0) { $item['retention_day'. $day] = round($item['retention_day'. $day]/$item['register_count'], 4)*100; } else { $item['retention_day'. $day] = '--'; } } $data[$key] = $item; } if ($dataOrder) { $data = $this->multisort($data, $orderColumn, $orderType); } } else { $this->assign('error', $error); } $this->checkListOrCountAuthRestMap($map,[]); $this->assign('data', $data); $this->assign('order_type', $orderType); $this->assign('order_column', $orderColumn); $this->assign('data', $data); $this->meta_title = '留存统计'; $this->display(); } /** * 留存统计 * @param int $p * 06.12.3 * xmy */ public function playerRetention($p = 0) { echo "暂不开放"; die(); $request=$_REQUEST; $page = intval($p); $page = $page ? $page : 1; //默认显示第一页数据 $arraypage=$page; if(isset($_REQUEST['row'])) {$row = $_REQUEST['row'];}else{$row = 10;} $start = I('start',date('Y-m-d',strtotime('-7 day'))); $end = empty(I('end')) ? time_format(time(),'Y-m-d') : I('end'); if(!empty($start)){ $game_id = I('game_id'); $promote_id = I('promote_id'); $map_list = array(); if(I('game_id') !=0){ $map['ur.game_id']=$map_list['tab_user.fgame_id'] = $game_id; $this->assign('game_name',get_game_name(I('game_id'))); } if(I('promote_id') !=0){ $map['tab_user.promote_id']=$map_list['tab_user.promote_id']=$promote_id; $this->assign('promote_name',get_promote_account(I('promote_id'))); } //统计每日注册数 $data = $this->count_register($start,$end,$game_id,$promote_id,$page); $day = array(1,2,3,4,5,6,7,15,30,60); foreach ($data as $k=>$v) { //当日注册人帐号 $time = $v['time']; //$map["FROM_UNIXTIME(register_time,'%Y-%m-%d')"] = $time; //每日留存 if(intval($v['register_num'])==0) {$data[$k][$value]=0;continue;} $map['tab_user.id'] = array('in',explode(',',$v['register'])); foreach ($day as $key => $value) { $map["register_time"] = array('between',array(strtotime($time),strtotime($time)+24*60*60-1)); $login_time = strtotime("+{$value} day",strtotime($time)); $login_time_end = $login_time+86399; $num = M('user','tab_') ->field('count(DISTINCT tab_user.id) as num') ->join("right join tab_user_login_record as ur on ur.user_id = tab_user.id and ur.login_time between $login_time and $login_time_end") ->where($map) ->find(); $data[$k][$value] = $num['num']; } } //分页 $time_map['time'] = array('between',array($start,$end)); $count = M('date_list')->where($time_map)->count(); $page = set_pagination($count,$row); if($page) {$this->assign('_page', $page);} }else{ unset($_REQUEST['data_order']); if(count(I('get.'))!=0){ $this->error('时间选择错误,请重新选择!'); } } if($request['data_order']!=''){ $data_order=reset(explode(',',$request['data_order'])); $data_order_type=end(explode(',',$request['data_order'])); $this->assign('userarpu_order',$data_order); $this->assign('userarpu_order_type',$data_order_type); } $data=my_sort($data,$data_order_type,(int)$data_order,SORT_STRING); $size=$row;//每页显示的记录数 $pnum = ceil(count($data) / $size); //总页数,ceil()函数用于求大于数字的最小整数 //用array_slice(array,offset,length) 函数在数组中根据条件取出一段值;array(数组),offset(元素的开始位置),length(组的长度) $data = array_slice($data, ($arraypage-1)*$size, $size); $this->assign('data',$data); $this->meta_title = '留存统计'; $this->display(); } /** * 流失分析 */ public function userloss(){ $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->meta_title = '流失分析'; $this->assign("json_data",json_encode($res)); $this->display(); } //流失率分析 public function loss_pic($para){ if (!empty($para['time_start']) && !empty($para['time_end'])) { $days = prDates($para['time_start'],$para['time_end']); $day = $days; $this->assign('tt',array_chunk($days,1)); } else { $defTimeE = date("Y-m-d",time()); $defTimeS = date("Y-m-d",time() - 24*60*60*6); $day = every_day(7); $days = prDates($defTimeS,$defTimeE); } if (isset($para['game_id'])) { $map['r.fgame_id']=$para['game_id']; $map1['r.fgame_id']=$para['game_id']; } if (!empty($para['channel_id'])) { if ($para['channel_id'] == 2 ) { $continueDay = 7; } else { $continueDay = 3; } }else{ $continueDay = 3;//3天不登录表示玩家已流失 } $usermodel = D('User'); //获取这个时间段内注册的玩家 $start = $this->get_time(current($days), $continueDay); $end = $this->get_time(end($days), $continueDay) + 86399;; $map['register_time']=array('between',array($start, $end)); if (isset($para['promote_id']) && $para['promote_id']!="") { $map['promote_id']=$para['promote_id']; } $players = $usermodel->getUserList($map, "GROUP_CONCAT(DISTINCT id) as user_ids, FROM_UNIXTIME(register_time+{$continueDay}*86400, '%Y-%m-%d') as register_date", "register_date"); $players = array_column($players, 'user_ids', 'register_date'); $map1 = array(); $map1['lpuid'] = 0; $map1['u.register_time'] = array('between',array($start, $end)); if (isset($para['promote_id'])&&$para['promote_id']!="") { $map1['u.promote_id']=$para['promote_id']; } //获取这段时间内有登录(未流失)的玩家 $map1['r.login_time'] = array('exp', 'BETWEEN UNIX_TIMESTAMP( FROM_UNIXTIME( u.register_time + 86400, "%Y-%m-%d" ) ) AND UNIX_TIMESTAMP( FROM_UNIXTIME( u.register_time + 86400, "%Y-%m-%d" ) ) + 86400 * ' . $continueDay); $keepPlayers = $usermodel->getKeepPlayers($map1, $continueDay, count($days) > 7);// 3或7天内有登录的玩家 $keepPlayers = array_column($keepPlayers, 'user_ids', 'register_date'); $loss_count = array();//流失玩家数量 foreach ($days as $key => $date) { $dateUserCount = isset($players[$date]) ? count(explode(",", $players[$date])) : 0; $keepUserCount = isset($keepPlayers[$date]) ? count(explode(",", $keepPlayers[$date])) : 0; $loss_count[$key] = $dateUserCount - $keepUserCount;//流失数量 if ($dateUserCount) { $loss_rate[] = sprintf("%.2f",($loss_count[$key]/$dateUserCount) * 100);//流失率 } else { $loss_rate[] = 0; } } $losers = array_filter($players, function ($item) use ($keepPlayers) { return !in_array($item, $keepPlayers); }); $losers = array_values($losers);//流失玩家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; } /** * 统计注册数 * @param $start 开始时间 * @param $end 结束时间 * @param string $game_name 游戏名称 * @param string $promote_id 渠道ID * @param int $page */ public function count_register($start,$end,$game_id="",$promote_id="",$page=0,$row=10){ $map["register_time"] = array('between',array(strtotime($start),strtotime($end)+86399)); $maps["time"] = array('between',array($start,$end)); if($game_id != ''){ $map['fgame_id'] = $game_id; } if($promote_id != ''){ $map['promote_id'] = $promote_id; } $map['puid']=0; $user = M('user','tab_')->field("FROM_UNIXTIME(register_time, '%Y-%m-%d') as time,COUNT(id) AS register_num,GROUP_CONCAT(id) as register") ->where($map) ->group("time") ->select(); $user2 = array_combine(array_column($user,'time'),array_column($user,'register')); $user = array_combine(array_column($user,'time'),array_column($user,'register_num')); //file_put_contents(dirname(__FILE__) . '/usersql2.txt',json_encode(M('user','tab_')->getLastSql())); //统计每日注册数 $data = M('date_list') ->field("time") ->where($maps) ->select(); foreach ($data as &$val){ $val['register_num'] = $user[$val['time']]?$user[$val['time']]:0; $val['register'] = $user2[$val['time']]?$user2[$val['time']]:''; } return $data; } /** * [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; } /* * 根据时间计算注册人数 */ public function getcount($day, $n = null) { if (null !== $n) { $map['register_time'] = get_start_end_time($day, $n); } else { $map = get_last_day_time($day, "register_time"); } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $map['tab_user.promote_id'] = array("elt", 0); } else { $map['tab_user.promote_id'] = get_promote_id($_REQUEST['promote_name']); } } if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['tab_user.fgame_id'] = get_game_id($_REQUEST['game_name']); } $r_user_id = D('User') ->where($map) ->select(); for ($i = 0; $i < count($r_user_id); $i++) { $sd[] = $r_user_id[$i]['user_id']; } $pid = implode(",", $sd); $count = D("User") ->where($map) ->count(); } else { $r_user_id = D("User")->where($map)->select(); for ($i = 0; $i < count($r_user_id); $i++) { $sd[] = $r_user_id[$i]['id']; } $pid = implode(",", $sd); $count = D("User")->where($map)->count(); } $r_count = array($pid, $count); return $r_count; } /* * 计算留存率 * */ public function onelogincount($day, $count, $n = null) { if (null !== $n) { $onetime['login_time'] = get_start_end_time($day, $n); } else { $onetime = get_last_day_time($day, "login_time"); } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $onetime['promote_id'] = array("elt", 0); } else { $onetime['promote_id'] = get_promote_id($_REQUEST['promote_name']); } } else { $onetime['promote_id'] = array('egt', 0); } if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $onetime['game_id'] = get_game_id($_REQUEST['game_name']); } } else { $onetime['game_id'] = array('gt', 0); } $onetime['user_id'] = array('in', (string)$count[0]); $onelogincount = M("user_login_record", "tab_")->where($onetime)->count('distinct user_id'); if ($onelogincount != 0) { if ($count[1] == 0) { $baifen = ""; } else { $lu = $onelogincount / $count[1]; $baifen = $lu * 100; $baifen = $baifen > 100 ? '100%' : $baifen . '%'; } } else { if ($count[1] == 0) { $baifen = ""; } elseif ($count[1] != 0) { $baifen = "0%"; } } return round($baifen) . '%'; } public function userarpu($p=0) { $request=$_REQUEST; $page = intval($p); $page = $page ? $page : 1; //默认显示第一页数据arraypage $arraypage = $page ? $page : 1; //默认显示第一页数据 if(isset($_REQUEST['row'])) {$row = $_REQUEST['row'];}else{$row = 10;} $start = I('start'); $end = empty(I('end')) ? time_format(time(),'Y-m-d') : I('end'); $game_id = I('game_id'); $promote_id = I('promote_id'); $map_list = array(); if ($_REQUEST['hasbindcoins'] == 1) { unset($hasbindcoins['pay_way']); } else { $hasbindcoins['pay_way'] = array('gt',-1); } if(I('game_id') !=0){ $this->assign('game_name',get_game_name(I('game_id'))); } if(I('promote_id') !=0){ $this->assign('promote_name',get_promote_account(I('promote_id'))); } if(I('game_id') != '') $map_list['game_id'] = I('game_id'); if(I('promote_id') != '') $map_list['promote_id'] = I('promote_id'); if(!empty($start)) { //新增玩家 // $data = $this->count_register($start, $end, $game_id, $promote_id, $page); $data = $this->count_register($start, $end, $game_id, $promote_id); // var_dump($data);exit; foreach ($data as $key => $value) { $time = $value['time']; //活跃玩家 $data[$key]['act_user'] = $this->count_act_user($time,$game_id,$promote_id); //1日留存 $map = $map_list; if($map_list['promote_id']!=''){ $map['tab_user.promote_id']=$map_list['promote_id']; } unset($map['promote_id']); //$map["FROM_UNIXTIME(,'%Y-%m-%d')"] = $time; $map["register_time"] = ['between', [strtotime($time), strtotime($time)+86399]]; $login_time = strtotime("+1 day",strtotime($time)); $login_time_end = $login_time+86399; $num_sql = M('user','tab_') ->field('tab_user.id') ->join("right join tab_user_login_record as ur on ur.user_id = tab_user.id and ur.login_time between $login_time and $login_time_end") ->where($map) ->group('user_id') ->find(); if (!empty($data[$key]['register_num'])) { $data[$key]['keep_num'] = round($num['num']/$data[$key]['register_num'],4)*100; } else { $data[$key]['keep_num'] = 0; } //充值 $map = $map_list; empty($game_name ) || $map['game_name'] = array('like','%'.$game_name.'%'); empty($promote_id) || $map['promote_id'] = $promote_id; $map['pay_status'] = 1; $map["pay_time"] = ['between',[strtotime($time),strtotime($time)+86399]]; empty($hasbindcoins) || $map['pay_way'] = $hasbindcoins['pay_way']; $spend = M('spend','tab_')->field("IFNULL(sum(pay_amount),0) as money,IFNULL(count(distinct user_id),0) as people") ->where($map)->find(); $data[$key]['spend'] = $spend['money']; //付费玩家数 $data[$key]['spend_people'] = $spend['people']; //新付费玩家 $newmap = $map_list; empty($hasbindcoins) || $newmap['pay_way'] = $hasbindcoins['pay_way']; $newmap['pay_status'] = 1; $sql = M('spend','tab_') ->field("user_id,min(pay_time) as time") ->group('user_id') ->where(array_merge($newmap,['_string'=>'(small_id=0 or small_id=user_id)'])) ->select(false); //$sql = "select IFNULL(count(user_id),0) as num from ({$sql}) as t WHERE FROM_UNIXTIME(t.time,'%Y-%m-%d') = '{$time}'"; $sql = M('spend','tab_') ->table('('.$sql.') as t') ->field('IFNULL(count(user_id),0) as num') ->where(array('time'=>['between',[strtotime($time),strtotime($time)+86399]])) ->select(false); $query = M()->query($sql); $data[$key]['new_pop'] = $query[0]['num']; //付费率 if (!empty($data[$key]['act_user'])) { $data[$key]['spend_rate'] = round($data[$key]['spend_people']/$data[$key]['act_user'],4)*100; } else { $data[$key]['spend_rate'] = 0; } //ARPU if (!empty($data[$key]['act_user'])) { $data[$key]['ARPU'] = round($data[$key]['spend']/$data[$key]['act_user'],2); } else { $data[$key]['ARPU'] = 0; } //ARPPU if (!empty($data[$key]['spend_people'])) { $data[$key]['ARPPU'] = round($data[$key]['spend']/$data[$key]['spend_people'],2); } else { $data[$key]['ARPPU'] = 0; } //累计付费玩家 $map = $map_list; empty($hasbindcoins) || $map['pay_way'] = $hasbindcoins['pay_way']; $map['pay_status'] = 1; $map["pay_time"] = array('elt',strtotime($time)+86399); $pop_num = M('spend','tab_')->field('count(distinct user_id) as num')->where($map)->select(); $data[$key]['pop_num'] = $pop_num[0]['num']; } //分页 $time_map['time'] = array('between',array($start,$end)); $count = M('date_list')->where($time_map)->count(); $page = set_pagination($count,$row); if($page) {$this->assign('_page', $page);} }else{ unset($_REQUEST['data_order']); if(count(I('get.'))!=0){ $this->error('时间选择错误,请重新选择!'); } } if($request['data_order']!=''){ $data_order=reset(explode(',',$request['data_order'])); $data_order_type=end(explode(',',$request['data_order'])); $this->assign('userarpu_order',$data_order); $this->assign('userarpu_order_type',$data_order_type); } $this->checkListOrCountAuthRestMap($map,[]); $data=my_sort($data,$data_order_type,(int)$data_order,SORT_STRING); $size=$row;//每页显示的记录数 $pnum = ceil(count($data) / $size); //总页数,ceil()函数用于求大于数字的最小整数 //用array_slice(array,offset,length) 函数在数组中根据条件取出一段值;array(数组),offset(元素的开始位置),length(组的长度) $data = array_slice($data, ($arraypage-1)*$size, $size); $this->meta_title = 'ARPU统计'; $this->assign('data',$data); $this->display(); } /** * 获取活跃用户数 * @param $time */ public function count_act_user($time,$game_id="",$promote_id=""){ $map["login_time"] = ['between',[strtotime($time),strtotime($time)+86399]]; $map1["register_time"]=['between',[strtotime($time),strtotime($time)+86399]]; empty($game_id) || $map['game_id'] = $game_id; empty($game_id) || $map1['fgame_id'] = $game_id; if(!empty($promote_id)){ $user=M('User','tab_')->field('id')->where(array('promote_id'=>$promote_id))->select(); $user=implode(',',array_column($user,'id')); $map['user_id']=array('in',$user); $map1['id']=array('in',$user); }; $uudata=M('User','tab_') ->field('id as user_id') ->where($map1) ->select(false); $data = M('user_login_record','tab_') ->field('user_id') ->where($map) ->union($uudata) ->group('user_id') ->select(); $data=count($data); return $data; } //计算指定日期新用户数 public function getnewcount($time) { $map = array(); if (!empty($time)) { $map['register_time'] = get_start_end_time($_REQUEST['time-start']); } else { $map['register_time'] = -1; } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $map['promote_id'] = array("elt", 0); } else { $map['promote_id'] = get_promote_id($_REQUEST['promote_name']); } } else { $map['promote_id'] = array('egt', 0); } if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['fgame_id'] = get_game_id($_REQUEST['game_name']); } } else { $map['fgame_id'] = array('gt', 0); } $r_user_id = M("User", "tab_") ->where($map) ->select(); for ($i = 0; $i < count($r_user_id); $i++) { $sd[] = $r_user_id[$i]['id']; } $pid = implode(",", $sd); $count = M("User", "tab_") ->where($map) ->count(); $count = array($pid, $count); return $count; } //计算留存数 public function getplaycount($day, $count, $n = null) { if (null !== $n) { $onetime['login_time'] = get_start_end_time($day, $n); } else { $onetime = get_last_day_time($day, "login_time"); } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $onetime['promote_id'] = array("elt", 0); } else { $onetime['promote_id'] = get_promote_id($_REQUEST['promote_name']); } } else { $onetime['promote_id'] = array('egt', 0); } if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $onetime['game_id'] = get_game_id($_REQUEST['game_name']); } } else { $onetime['game_id'] = array('gt', 0); } $onetime['user_id'] = array('in', (string)$count[0]); $onelogincount = M("user_login_record", "tab_")->where($onetime)->count('distinct user_id'); return $onelogincount; } //计算次日留存率 function get_cilogin($newcount, $cicount) { if ($cicount == 0) { return sprintf("%.2f", 0) . '%'; } else { return round($cicount / $newcount * 100) . '%'; } } //计算指定游戏 用户总数 与时间无关 public function getallcount() { $map = array(); if (!isset($_REQUEST['time-start'])) { $map['a.register_time'] = -1; } if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['a.fgame_id'] = get_game_id($_REQUEST['game_name']); } } else { $map['a.fgame_id'] = array('gt', 0); } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $map['a.promote_id'] = array("elt", 0); } else { $map['a.promote_id'] = get_promote_id($_REQUEST['promote_name']); } } else { $map['a.promote_id'] = array('egt', 0); } $count = M("User as a", "tab_") ->field("count(*) as count") ->where($map) ->count(); return $count; } //计算付费用户数 public function getpaycount() { $count = 0; if (isset($_REQUEST['time-start'])) { $map['pay_time'] = array("lt", strtotime($_REQUEST['time-start']) + (60 * 60 * 24)); } else { $map['pay_time'] = -1; } $map['pay_status'] = 1; if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['game_id'] = get_game_id($_REQUEST['game_name']); } } else { $map['game_id'] = array('gt', 0); } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $map['promote_id'] = array("elt", 0); } else { $map['promote_id'] = get_promote_id($_REQUEST['promote_name']); } } else { $map['promote_id'] = array('egt', 0); } $count = M("spend", "tab_") ->where($map) ->count('distinct id'); return $count; } //计算新用户付费金额 public function getnewpaycount() { $count = 0; if (isset($_REQUEST['time-start'])) { $map['pay_time'] = array("lt", strtotime($_REQUEST['time-start']) + (60 * 60 * 24)); $newuser = $this->getnewcount($_REQUEST['time-start']); $map['user_id'] = array('in', (string)$newuser[0]); } else { $map['pay_time'] = -1; } $map['pay_status'] = 1; if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['a.fgame_id'] = get_game_id($_REQUEST['game_name']); } } else { $map['a.fgame_id'] = array('gt', 0); } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $map['a.promote_id'] = array("elt", 0); } else { $map['a.promote_id'] = get_promote_id($_REQUEST['promote_name']); } } else { $map['a.promote_id'] = array('egt', 0); } $list = M("User as a", "tab_") ->field("sum(pay_amount) as sum") ->join("tab_spend as c on c.game_id=a.fgame_id") ->where($map) ->group('a.id') ->find(); if (!empty($list['sum'])) { $count = $list['sum']; } return sprintf("%.2f", $count); } //计算总付费金额 public function getallpaycount() { $count = 0; $map = array(); if (!isset($_REQUEST['time-start'])) { $map['pay_time'] = -1; } $map['pay_status'] = 1; if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['game_id'] = get_game_id($_REQUEST['game_name']); } } else { $map['game_id'] = array('gt', 0); } if (isset($_REQUEST['promote_name'])) { if ($_REQUEST['promote_name'] == '全部') { unset($_REQUEST['promote_name']); } else if ($_REQUEST['promote_name'] == '自然注册') { $map['promote_id'] = array("elt", 0); } else { $map['promote_id'] = get_promote_id($_REQUEST['promote_name']); } } else { $map['promote_id'] = array('egt', 0); } $list = M("spend", "tab_") ->field("sum(pay_amount) as sum") ->where($map) ->find(); if (!empty($list['sum'])) { $count = $list['sum']; } return sprintf("%.2f", $count); } //计算总付费率 public function getrate() { $pr = $this->getpaycount();//总付费人数 $all = $this->getallcount(); if ($all == 0) { $count = 0; } else { $count = $pr / $all; $count = $count > 1 ? 100 : $count * 100; } return sprintf("%.2f", $count) . '%'; } // 计算活跃用户数(当前日期所在一周的时间) public function gethuocount() { $count = 0; if (isset($_REQUEST['game_name']) || isset($_REQUEST['time-start'])) { if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['game_id'] = $_REQUEST['game_id']; $time = date("Y-m-d", time()); $start = strtotime("$time - 6 days"); //周末 $end = strtotime("$time"); $map['login_time'] = array("between", array($start, $end)); } } if (isset($_REQUEST['time-start'])) { $time2 = $_REQUEST['time-start']; $start2 = strtotime("$time2 - 6 days"); //周末 $end2 = strtotime("$time2"); $map['login_time'] = array("between", array($start2, $end2)); } $data = M("user_login_record", "tab_") ->group('user_id') ->having('count(user_id) > 2') ->where($map) ->select(); $count = count($data); } return sprintf("%.2f", $count); } //获取用户ARPU public function getuserarpu() { $new = $this->getnewpaycount(); if (isset($_REQUEST['time-start'])) { $newcount = end($this->getnewcount($_REQUEST['time-start'])); if ($newcount == 0) { $count = 0; } else { $count = $new / $newcount; } } else { $count = 0; } return sprintf("%.2f", $count); } // 获取活跃ARPU public function gethuoarpu() { if (isset($_REQUEST['game_name']) || isset($_REQUEST['time-start'])) { if (isset($_REQUEST['game_name'])) { if ($_REQUEST['game_name'] == '全部') { unset($_REQUEST['game_name']); } else { $map['tab_user_login_record.game_id'] = get_game_id($_REQUEST['game_name']); $time = date("Y-m-d", time()); $start = strtotime("$time - 6 days"); //周末 $end = strtotime("$time"); $map['login_time'] = array("between", array($start, $end)); } } if (isset($_REQUEST['time-start'])) { $time2 = $_REQUEST['time-start']; $start2 = strtotime("$time2 - 6 days"); //周末 $end2 = strtotime("$time2"); $map['login_time'] = array("between", array($start2, $end2)); } $data = M("user_login_record", "tab_") ->group('user_id') ->having('count(user_id) > 2') ->where($map) ->select(); foreach ($data as $key => $value) { $data1[] = $value['user_id']; } foreach ($data1 as $value) { $user_account[] = get_user_account($value); } $pid = implode(',', $user_account); } $map['user_account'] = array('in', $pid); if ($pid != '') { $huosum = M("spend ", "tab_") ->distinct(true) ->field("pay_amount") ->join("tab_user_login_record on tab_spend.game_id = tab_user_login_record.game_id") ->where($map) ->select(); foreach ($huosum as $value) { $huosum2[] = $value['pay_amount']; } $sum = array_sum($huosum2); $count = count($data); $return = $sum / $count; } else { $return = 0; } return $return; } //获取付费ARPU public function getpayarpu() { $paysum = $this->getallpaycount();//所有用户付费 $paycount = $this->getpaycount();//新用户付费 if ($paycount != 0) { $count = $paysum / $paycount; } else { $count = 0; } return sprintf("%.2f", $count); } public function cha_userarpu($p=0){ $page = intval($p); $page = $page ? $page : 1; //默认显示第一页数据arraypage $arraypage = $page ? $page : 1; //默认显示第一页数据 $row = 10; $time = $_REQUEST['time']; $promote_id = $_REQUEST['promote_id']; $join = "left join tab_user u on u.fgame_id = tab_game.id"; if($time==''){ $this->error('参数错误,缺少时间'); }else{ $map['register_time']=array('between',array(strtotime($time),strtotime($time)+24*60*60-1)); } if($promote_id!=''){ $map_list['promote_id']=$promote_id; $map['promote_id']=$promote_id; $join .= " AND u.promote_id = {$promote_id}"; } if ($_REQUEST['hasbindcoins'] == 1) { unset($hasbindcoins['pay_way']); } else { $hasbindcoins['pay_way'] = array('gt',-1); } $map['puid']=0; $data=M('Game','tab_')->field('id as game_id, game_name')->order('id desc')->select(); foreach ($data as $key => $value) { $game_id = $value['game_id']; $map_list['game_id']=$game_id; $user=M('User','tab_'); $spend=M('spend','tab_'); //新增人数 $rdata=$user ->field('count(id) as register_num') ->where(array('fgame_id'=>$game_id)) ->where($map) ->find(); $data[$key]['register_num']=$rdata['register_num']; //活跃玩家 $data[$key]['act_user'] = $this->count_act_user($time,$game_id,$promote_id); //1日留存 $mapl=$map_list; $mapl["register_time"] = ['between',[strtotime($time),strtotime($time)+86399]]; if ($promote_id!='') $mapl['tab_user.promote_id']=$mapl['promote_id']; unset($mapl['promote_id']); $login_time = date('Y-m-d', strtotime("+1 day",strtotime($time))); $login_start = strtotime($login_time); $login_end = $login_start + 86399; $num = $user ->field('count(DISTINCT tab_user.id) as num') ->join("right join tab_user_login_record as ur on ur.user_id = tab_user.id and ur.login_time between {$login_start} and {$login_end}") ->where($mapl) ->find(); if (!empty($data[$key]['register_num'])) { $data[$key]['keep_num'] = round($num['num']/$data[$key]['register_num'],4)*100; } else { $data[$key]['keep_num'] = 0; } //充值 $mapl = $map_list; empty($game_name ) || $mapl['game_name'] = array('like','%'.$game_name.'%'); empty($promote_id) || $mapl['promote_id'] = $promote_id; empty($hasbindcoins) || $mapl['pay_way'] = $hasbindcoins['pay_way']; $mapl['pay_status'] = 1; $mapl["pay_time"] = ['between',[strtotime($time),strtotime($time)+86399]]; $spend = $spend->field("IFNULL(sum(pay_amount),0) as money,IFNULL(count(distinct user_id),0) as people")->where($mapl)->find(); $data[$key]['spend'] = $spend['money']; //付费玩家数 $data[$key]['spend_people'] = $spend['people']; //付费率 if (!empty($data[$key]['act_user'])) { $data[$key]['spend_rate'] = round($data[$key]['spend_people']/$data[$key]['act_user'],4)*100; } else { $data[$key]['spend_rate'] = 0; } //ARPU if (!empty($data[$key]['act_user'])) { $data[$key]['ARPU'] = round($data[$key]['spend']/$data[$key]['act_user'],2); } else { $data[$key]['ARPU'] = 0; } //ARPPU if (!empty($data[$key]['spend_people'])) { $data[$key]['ARPPU'] = round($data[$key]['spend']/$data[$key]['spend_people'],2); } else { $data[$key]['ARPPU'] = 0; } // if($data[$key]['register_num']==0&&$data[$key]['act_user']==0&&$data[$key]['keep_num']==0&&$data[$key]['spend']==0&&$data[$key]['spend_people']==0){ // unset($data[$key]); // } } $count=count($data); if($count > $row){ $page = new \Think\Page($count, $row); $page->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%'); $this->assign('_page', $page->show()); } $size=$row;//每页显示的记录数 $pnum = ceil(count($data) / $size); //总页数,ceil()函数用于求大于数字的最小整数 //用array_slice(array,offset,length) 函数在数组中根据条件取出一段值;array(数组),offset(元素的开始位置),length(组的长度) $data = array_slice($data, ($arraypage-1)*$size, $size); $this->assign('list_data',$data); $this->display(); } function game_analysis(){ if($_REQUEST['time-start']!=''&&$_REQUEST['time-end']!=''){ $start=$_REQUEST['time-start']; $end=$_REQUEST['time-end']; }else{ $start=get_lastweek_name(6); $end=date('Y-m-d'); } $umap['register_time']=array('BETWEEN',array(strtotime($start),strtotime($end)+24*60*60-1)); $smap['pay_time']=array('BETWEEN',array(strtotime($start),strtotime($end)+24*60*60-1)); if($_REQUEST['promote_id']!=''){ $umap['promote_id']=$_REQUEST['promote_id']; $smap['promote_id']=$_REQUEST['promote_id']; } $data=M('Game','tab_')->field('id as game_id, game_name')->order('id desc')->select(); foreach ($data as $key => $value) { $umap['fgame_id']=$value['game_id']; $smap['game_id']=$value['game_id']; $udata=M('User','tab_') ->field('count(id) as register_num') ->where($umap) ->find(); $data[$key]['count']=$udata['register_num']; $smap['pay_status']=1; $sdata=M('Spend','tab_') ->field('ifnull(sum(pay_amount),0) as sum') ->where($smap) ->find(); $data[$key]['sum']=$sdata['sum']; } if($_REQUEST['data_order']==2){ $data_order_type='sum'; $data_order=3;//倒序 }else{ $data_order_type='count'; $data_order=3; } $data=my_sort($data,$data_order_type,(int)$data_order); $data = array_slice($data, 0, 12); // 前台显示 // X轴游戏 $xAxis="["; foreach ($data as $tk => $tv) { $xAxis.="'".$tv['game_name']."',"; } $xAxis.="]"; //x轴注册数据 $xzdate="["; foreach ($data as $key => $value) { $xzdate.="'".$value['count']."',"; } $xzdate.="]"; //x轴充值数据 $xsdate="["; foreach ($data as $key => $value) { $xsdate.="'".$value['sum']."',"; } $xsdate.="]"; $this->meta_title = '游戏分析'; $this->assign('xzdate',$xzdate); $this->assign('xsdate',$xsdate); $this->assign('xAxis',$xAxis); $this->assign('start',$start); $this->assign('end',$end); $this->assign('data',$data); $this->display(); } function promote_analysis(){ if($_REQUEST['time-start']!=''&&$_REQUEST['time-end']!=''){ $start=$_REQUEST['time-start']; $end=$_REQUEST['time-end']; }else{ $start=get_lastweek_name(6); $end=date('Y-m-d'); } $umap['register_time']=array('BETWEEN',array(strtotime($start),strtotime($end)+24*60*60-1)); $smap['pay_time']=array('BETWEEN',array(strtotime($start),strtotime($end)+24*60*60-1)); $hStart = strtotime($start); $hEnd = strtotime($end)+24*60*60-1; if($_REQUEST['game_id']!=''){ $umap['fgame_id']=$_REQUEST['game_id']; $smap['game_id']=$_REQUEST['game_id']; } $data=M('Promote','tab_')->field('id as promote_id,account as promote_name')->order('id desc')->select(); foreach ($data as $key => $value) { $umap['promote_id']=$value['promote_id']; $smap['promote_id']=$value['promote_id']; $echohavingUser = $havingUser.' and promote_id = '.$value['promote_id']; $udata=M('User','tab_') ->field('count(id) as register_num,register_time,fgame_id,promote_id') ->where($umap) ->find(); $data[$key]['count']=$udata['register_num']; $smap['pay_status']=1; $sdata=M('Spend','tab_') ->field('ifnull(sum(pay_amount),0) as sum') ->where($smap) ->find(); $data[$key]['sum']=$sdata['sum']; } $data_order_type = ''; if($_REQUEST['data_order']==2){ $data_order_type='sum'; $data_order=3;//倒序 }else{ $data_order_type='count'; $data_order=3; } $data=my_sort($data,$data_order_type,(int)$data_order); $data = array_slice($data, 0, 12); // 前台显示 // X轴游戏 $xAxis="["; foreach ($data as $tk => $tv) { $xAxis.="'".$tv['promote_name']."',"; } $xAxis.="]"; //x轴注册数据 $xzdate="["; foreach ($data as $key => $value) { $xzdate.="'".$value['count']."',"; } $xzdate.="]"; //x轴充值数据 $xsdate="["; foreach ($data as $key => $value) { $xsdate.="'".$value['sum']."',"; } $xsdate.="]"; $this->meta_title = '推广员分析'; $this->assign('xzdate',$xzdate); $this->assign('xsdate',$xsdate); $this->assign('xAxis',$xAxis); $this->assign('start',$start); $this->assign('end',$end); $this->assign('data',$data); $this->display(); } /* * 应用概况 * @author 鹿文学 */ public function device_survey() { set_time_limit(0); // $device = D('DeviceRecord'); // 统计 // $total = $device->all_device(); // $todaystart = mktime(0,0,0,date('m'),date('d'),date('Y')); // $today = $device->total_device(['create_time'=>array('between',[$todaystart,$todaystart+86399])]); // $yesterday = $device->total_device(['create_time'=>array('between',[$todaystart-86400,$todaystart-1])]); // // $day7 = $device->total_device(['create_time'=>array('between',[$todaystart-86400*7,$todaystart-1])],1); // // // $day30 = $device->total_device(['create_time'=>array('between',[$todaystart-86400*30,$todaystart-1])],1); // $duration = $device->single_duration(['create_time'=>array('between',[$todaystart-86400*7,$todaystart-1])]); // $this->assign('total',$total); // $this->assign('today',$today); // $this->assign('yesterday',$yesterday); // $this->assign('day7',$day7); // $this->assign('day30',$day30); // $this->assign('duration7',second_to_duration($duration/7)); // 日历 R('Index/calendar'); // 折线图 $this->foldLineDiagram($_REQUEST['start'],$_REQUEST['end'],$_REQUEST['num']); $this->checkListOrCountAuthRestMap($map,[]); $this->display(); } public function getDevice() { set_time_limit(0); $type = I("type",0); $device = D('DeviceRecord'); $todaystart = mktime(0,0,0,date('m'),date('d'),date('Y')); $model = M('device_statistics','tab_'); if ($type == 0) { $return = $model->where(array('time'=>array('neq',0)))->sum('new_device'); // $return = $device->all_device(); } else if($type == 1) { $return = $model->where(['time'=>array('between',[$todaystart,$todaystart+86399])])->sum('new_device'); // $return = $device->total_device(['create_time'=>array('between',[$todaystart,$todaystart+86399])]); } else if($type == 2) { $return = $model->where(['time'=>array('between',[$todaystart-86400,$todaystart-1])])->sum('new_device'); // $return = $device->total_device(['create_time'=>array('between',[$todaystart-86400,$todaystart-1])]); } else if($type == 3) { // $return = $model->where(['time'=>array('between',[$todaystart-86400*7,$todaystart-1])])->sum('active_device'); $return = $this->getActiveDeviceNum(['time'=>['between',[$todaystart-86400*7,$todaystart-1]]]); // $return = $device->total_device(['create_time'=>array('between',[$todaystart-86400*7,$todaystart-1])],1); } else if($type == 4) { // $return = $model->where(['time'=>array('between',[$todaystart-86400*30,$todaystart-1])])->sum('active_device'); $return = $this->getActiveDeviceNum(['time'=>array('between',[$todaystart-86400*30,$todaystart-1])]); // $return = $device->total_device(['create_time'=>array('between',[$todaystart-86400*30,$todaystart-1])],1); } else if ($type == 5) { $return = second_to_duration(($model->where(['time'=>$todaystart])->sum('duration7'))); // $return = second_to_duration($device->single_duration(['create_time'=>array('between',[$todaystart-86400*7,$todaystart-1])])/7); } $this->ajaxReturn($return?$return:0) ; } public function getActiveDeviceNum($map) { $modelData = M('device_statistics','tab_') ->field("model") ->where($map) ->select(); $modelNew = 0; $unique_code = []; foreach($modelData as $key => $value) { $resolveData = json_decode($value['model'],true); // dump($resolveData); foreach($resolveData as $k => $v) { // if (!isset($modelNew[$v['model']][$v['version']])) { // $modelNew = 1; // $unique_code[$v['unique_code']] = 1; // } // else if(!$unique_code[$v['unique_code']]){ $modelNew++; $unique_code[$v['unique_code']] = 1; // array_push($unique_code,$v['unique_code']); } } } return $modelNew; } /* * 折线图 * @param integer $start 开始时间 * @param integer $end 结束时间 * @param boolean $flag 是否ajax返回 * @author 鹿文学 */ public function foldLineDiagram($start='',$end='',$num='',$flag=false) { $starttime = $start?strtotime($start):mktime(0,0,0,date('m'),date('d')-1,date('Y')); $endtime = $end?strtotime($end)+86399:$starttime+86399; $start = date('Y-m-d',$starttime); $end = date('Y-m-d',$endtime); $device = D('DeviceRecord'); if ($start == $end) { $day_count = 1; if ($start == date('Y-m-d',strtotime('-1 day'))) {$num = 2;} $hours = ['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23']; $data['date'] = [$start]; $data['hours'] = 1; foreach($hours as $v) { $data['news']['ios'][$v] = 0; $data['news']['and'][$v] = 0; $data['active']['ios'][$v] = 0; $data['active']['and'][$v] = 0; } $deviceDataAnd = M("device_statistics","tab_")->where(['time'=>strtotime($start),'version'=>1])->find(); $deviceDataIos = M("device_statistics","tab_")->where(['time'=>strtotime($start),'version'=>2])->find(); // 新增设备 // $hoursnews = $device->news_on_time(['create_time'=>['between',[$starttime,$endtime]]],'news',5,'time,version'); $hoursnews = array_merge(json_decode($deviceDataAnd['today_new_device'],true),json_decode($deviceDataIos['today_new_device'],true)); // 活跃设备 // $hoursactive = $device->active_on_time(['create_time'=>['between',[$starttime,$endtime]]],'active',5,'time,version'); $hoursactive = array_merge(json_decode($deviceDataAnd['today_active_device'],true),json_decode($deviceDataIos['today_active_device'],true)); // 启动机型 // $hoursmodel = $device->model(['create_time'=>['between',[$starttime,$endtime]]]); $hoursmodel = array_merge(json_decode($deviceDataAnd['today_model_device'],true),json_decode($deviceDataIos['today_model_device'],true)); foreach($hours as $v) { foreach($hoursnews as $h) { $time = explode(' ',$h['time']); if ($time[1] == $v){ $data['news'][$h['version']==1?'and':'ios'][$v]+= (integer)$h['news']; } } foreach($hoursactive as $h) { $time = explode(' ',$h['time']); if ($time[1] == $v){ $data['active'][$h['version']==1?'and':'ios'][$v] += (integer)$h['active']; } } } foreach($hoursmodel as $k=>$h) { $data['xmodel'][$h['version']==1?'and':'ios'][] = "'".$h['model']."'"; $data['model'][$h['version']==1?'and':'ios'][$h['model']] = (integer)$h['count']; } } else { $datelist = get_date_list($starttime,$endtime,$num==7?4:1); $day_count = count($datelist); $data['date'] = $datelist; $data['hours'] = 0; foreach($datelist as $k => $v) { $data['news']['ios'][$v] = 0; $data['news']['and'][$v] = 0; $data['active']['ios'][$v] = 0; $data['active']['and'][$v] = 0; } $newData = M('device_statistics','tab_') ->field("new_device as news,version,FROM_UNIXTIME(time,'%Y-%m-%d') as time") ->where(['time'=>['between',[$starttime,$endtime]],'new_device'=>['neq','0']]) ->group('time,version') ->select(); // 新增设备 // $news = $device->news_on_time(['create_time'=>['between',[$starttime,$endtime]]],'news',$num==7?2:1,'time,version'); $news = $newData; $activeData = M('device_statistics','tab_') ->field("active_device as active,version,FROM_UNIXTIME(time,'%Y-%m-%d') as time") ->where(['time'=>['between',[$starttime,$endtime]],'active_device'=>['neq','0']]) ->group('time,version') ->select(); // 活跃设备 // $active = $device->active_on_time(['create_time'=>['between',[$starttime,$endtime]]],'active',$num==7?2:1,'time,version'); $active = $activeData; // 启动机型 $modelData = M('device_statistics','tab_') ->field("model") ->where(['time'=>['between',[$starttime,$endtime]]]) ->select(); $modelNew = []; $unique_code = []; foreach($modelData as $key => $value) { $resolveData = json_decode($value['model'],true); // dump($resolveData); foreach($resolveData as $k => $v) { if (!isset($modelNew[$v['model']][$v['version']])) { $modelNew[$v['model']][$v['version']] = 1; $unique_code[$v['unique_code']] = 1; } else if(!$unique_code[$v['unique_code']]){ $modelNew[$v['model']][$v['version']]++; $unique_code[$v['unique_code']] = 1; // array_push($unique_code,$v['unique_code']); } } } $unique_code = []; $modelNewData = []; $modelKey = 0; foreach($modelNew as $key => $value) { $modelNewData[$modelKey]['model'] = $key; foreach($value as $k => $v) { $modelNewData[$modelKey]['version'] = $k; $modelNewData[$modelKey]['count'] = $v; } $modelKey++; } $last_names = array_column($modelNewData,'count'); array_multisort($last_names,SORT_DESC,$modelNewData); // dump($modelNewData); // die(); // $model = $device->model(['create_time'=>['between',[$starttime,$endtime]]]); // dump($model);die(); $model = $modelNewData; foreach($datelist as $v) { foreach($news as $h) { if ($v == $h['time']) { $data['news'][$h['version']==1?'and':'ios'][$v] += (integer)$h['news']; } } foreach($active as $h) { if ($v == $h['time']) { $data['active'][$h['version']==1?'and':'ios'][$v] += (integer)$h['active']; } } } foreach($model as $k=>$h) { $data['xmodel'][$h['version']==1?'and':'ios'][] = "'".$h['model']."'"; $data['model'][$h['version']==1?'and':'ios'][$h['model']] = (integer)$h['count']; } } foreach($data as $k => $v) { if (is_array($v)) { if ($k == 'date'){ $data[$k] = '"'.implode('","',$v).'"'; $table[$k] = $v; }elseif($k == 'xmodel'){ $table[$k]['ios'] = $v['ios']; $table[$k]['and'] = $v['and']; $data[$k]['ios'] = implode(',',$v['ios']); $data[$k]['and'] = implode(',',$v['and']); }elseif($k == 'model'){ $table[$k]['ios'] = $v['ios']; $table[$k]['and'] = $v['and']; $tempexport=[]; foreach($v['ios'] as $t => $s) { $tempexport[]=['model'=>$t,'count'=>$s,'version'=>'ios']; } foreach($v['and'] as $t => $s) { $tempexport[]=['model'=>$t,'count'=>$s,'version'=>'android']; } $export[$k]=$tempexport; $data[$k]['ios'] = implode(',',$v['ios']); $data[$k]['and'] = implode(',',$v['and']); }else{ $sum = 0;$x='';$y=0;$tempexport=[];$count=0; foreach($v['ios'] as $t => $s){ $sum += $s;$count++; if($data['hours']==1){ if ($t%2==1) {$tab['ios'][$x.'~'.$t] = $y+$s;$x='';$y=0;}else{$x .= $t;$y += $s;} $tempexport[]=['time'=>$start.' '.(substr($t,0,2)).':00','count'=>$s,'version'=>'ios']; }else{ $tempexport[]=['time'=>$t,'count'=>$s,'version'=>'ios']; } } foreach($v['and'] as $t => $s){ $sum += $s;$count++; if($data['hours']==1){ if ($t%2==1) {$tab['and'][$x.'~'.$t] = $y+$s;$x='';$y=0;}else{$x .= $t;$y += $s;} $tempexport[]=['time'=>$start.' '.(substr($t,0,2)).':00','count'=>$s,'version'=>'android']; }else{ $tempexport[]=['time'=>$t,'count'=>$s,'version'=>'android']; } } if($data['hours']==1){ $table[$k]=$tab; $export['average'][$k]=$table['average'][$k]=$sum; }else{ $table[$k] = $v; $export['average'][$k]=$table['average'][$k]=round($sum/$day_count,2); } $export['sum'][$k] = $table['sum'][$k]=$sum; $export[$k]=$tempexport; $data[$k]['ios'] = implode(',',$v['ios']); $data[$k]['and'] = implode(',',$v['and']); } } } if ($start != $end) { $table['duplicate']['active'] = $this->getActiveDeviceNum(['time'=>array('between',[$starttime,$endtime])]); $table['average']['active'] = number_format($table['duplicate']['active']/(((($endtime+1)-$starttime)/86400)),2,'.',''); // var_dump($endtime-$starttime);die(); } else { $table['duplicate']['active'] = $table['sum']['active']; } @file_put_contents(RUNTIME_PATH.'/device_data_foldline.txt',json_encode($export)); if ($flag) { $data['table'] = $table; echo json_encode($data); } else { $this->assign('foldline',$data); $this->assign('table',$table); $this->assign('num',$num); } } }