0) { $conditions['game_id'] = $gameId; } if ($serverId > 0) { $conditions['server_id'] = $serverId; } $conditions['pay_way'] = $isBan ? ['neq', '-10'] : ['neq', '-1']; return $conditions; } private function getGameGroupConditions($params) { $beginTime = $params['begin_time'] ?? 0; $endTime = $params['end_time'] ?? 0; $ids = $params['promote_ids'] ?? []; $gameIds = $params['game_ids'] ?? []; $conditions = []; $conditions['promote_id'] = ['in', $ids]; $conditions[$params['time_column']] = ['between', [$beginTime, $endTime]]; $conditions['game_id'] = ['in', $gameIds]; return $conditions; } /** * 按照时间分组统计登录总数 */ public function getLoginCountGroupByDay($params) { $dayList = $params['dayList'] ?? []; $params['time_column'] = 'login_time'; $conditions = $this->getDayGroupConditions($params); $items = M('user_login_record', 'tab_')->field('FROM_UNIXTIME(login_time, "%Y-%m-%d") as day, count(DISTINCT user_id) as count') ->where($conditions) ->group('day') ->select(); return $this->assembleRecords($items, $dayList, 'count'); } /** * 按照游戏分组统计登录总数 */ public function getLoginCountGroupByGame($params) { $gameIds = $params['game_ids'] ?? []; $params['time_column'] = 'login_time'; $conditions = $this->getGameGroupConditions($params); $items = M('user_login_record', 'tab_')->field('game_id, count(DISTINCT user_id) as count') ->where($conditions) ->group('game_id') ->select(); return $this->assembleRecords($items, $gameIds, 'count', 'game_id'); } /** * 按照时间分组统计注册总数 */ public function getRegisterCountGroupByDay($params) { $dayList = $params['dayList'] ?? []; $params['time_column'] = 'register_time'; $conditions = $this->getDayGroupConditions($params); $items = M('user', 'tab_')->field('count(*) count, FROM_UNIXTIME(register_time, "%Y-%m-%d") as day') ->where($map) ->group('day') ->select(); return $this->assembleRecords($items, $dayList, 'count'); } /** * 按照游戏分分组统计注册总数 */ public function getRegisterCountGroupByGame($params) { $gameIds = $params['game_ids'] ?? []; $params['time_column'] = 'register_time'; $conditions = $this->getGameGroupConditions($params); $items = M('user', 'tab_')->field('count(*) count, fgame_id') ->where($conditions) ->group('fgame_id') ->select(); return $this->assembleRecords($items, $gameIds, 'count', 'fgame_id'); } /** * 按照时间分组统计注册编号序列 * @param string $newslist 新玩家序列 * @param integer $end 结束时间(时间戳) * @param integer $game_id 游戏编号 * @param integer/string $promote_id 渠道编号或渠道编号列表字符串(字符串逗号分隔) * @param integer $flag 留存类型 * @return array 详细数据 * @author 鹿文学 */ public function getRatentionRate($newslist,$game_id=0,$promote_id=0,$flag=1) { $map['lock_status']=1; if($game_id>0) { $map['up.game_id'] = $game_id; } $map['tab_user.promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id); $group = 'up.login_time'; $fieldname = 'retention_rate'.$flag; foreach ($newslist as $value) { $ct1 = strtotime("+$flag day",strtotime($value['time'])); $ct2 = strtotime("+1 day",$ct1)-1; $map[$group] = array(array('egt',$ct1),array('elt',$ct2)); $map['user_id']=array('in',$value['id']); $count = count(explode(',',$value['id'])); $d = $this ->field('count(distinct up.user_id) as '.$fieldname.' ,FROM_UNIXTIME(up.login_time,"%Y-%m-%d") as play_time') ->join('tab_user_login_record up on tab_user.id=up.user_id','right') ->where($map) ->group('play_time') ->select(); if ($d) $data[]=array( "play_time"=>$value['time'], $fieldname=>($d[0][$fieldname]==0)?0:sprintf("%.2f",($d[0][$fieldname]/$count)*100) ); } return $data; } }