You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
7.1 KiB
PHTML

5 years ago
<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace Home\Model;
use Think\Model;
/**
* 分类模型
*/
class UserModel extends Model{
protected $_validate = array(
);
protected $_auto = array(
);
/**
* 构造函数
* @param string $name 模型名称
* @param string $tablePrefix 表前缀
* @param mixed $connection 数据库连接信息
*/
public function __construct($name = '', $tablePrefix = '', $connection = '') {
/* 设置默认的表前缀 */
$this->tablePrefix ='tab_';
/* 执行构造方法 */
parent::__construct($name, $tablePrefix, $connection);
}
/**
* 按照时间分组统计注册总数
* @param integer $start 开始时间(时间戳)
* @param integer $end 结束时间(时间戳)
* @param integer $game_id 游戏编号
* @param integer/string $promote_id 渠道编号或渠道编号列表字符串(字符串逗号分隔)
* @return array 详细数据
* @author 鹿文学
*/
public function register_count_by_time($start,$end,$game_id=0,$promote_id=0,$group='time') {
$map['lock_status']=1;
$map['register_time'] = array('between',array($start,$end));
$map['fgame_id'] = $game_id>0?$game_id:array('egt',0);
$map['promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id);
$data = $this->field("FROM_UNIXTIME(register_time,'%Y-%m-%d') as $group,count(id) as register_num")
->where($map)->group($group)->select();
return $data;
}
/**
* 按照时间分组统计登录总数
* @param integer $start 开始时间(时间戳)
* @param integer $end 结束时间(时间戳)
* @param integer $game_id 游戏编号
* @param integer/string $promote_id 渠道编号或渠道编号列表字符串(字符串逗号分隔)
* @return array 详细数据
* @author 鹿文学
*/
public function login_count_by_time($start,$end,$game_id=0,$promote_id=0,$group='time') {
$tmap['lock_status']=$map['lock_status']=1;
$tmap['register_time']=$map['up.login_time'] = array('between',array($start,$end));
if($game_id>0) {
$tmap['fgame_id']=$map['up.game_id'] = $game_id;
}
$tmap['promote_id']=$map['tab_user.promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id);
/* $data = $this->field("FROM_UNIXTIME(up.login_time,'%Y-%m-%d') as $group,count(distinct up.user_id) as login_num")
->join('tab_user_login_record up on up.user_id=tab_user.id','right')
->where($map)->group($group)->select(); */
$union = $this->field('FROM_UNIXTIME(register_time,"%Y-%m-%d") as '.$group.',GROUP_CONCAT(DISTINCT id) as user_id')
->where($tmap)->group($group)->select(false);
$sql = $this->field('FROM_UNIXTIME(up.login_time,"%Y-%m-%d") as '.$group.',GROUP_CONCAT(DISTINCT up.user_id) as user_id')
->join('tab_user_login_record up on up.user_id=tab_user.id','inner')
->union($union)
->where($map)->group($group)->select(false);
$lists = $this->table('('.$sql.') as a')->field('a.'.$group.',GROUP_CONCAT(a.user_id) as user_id')->group('a.'.$group)->select();
foreach($lists as $k => $v) {
$login = array_unique(explode(',',$v['user_id']));
$data[$k] = array(
$group => $v[$group],
'login_num' => count($login),
);
}
return $data;
}
/**
* 按照时间分组统计注册编号序列
* @param integer $start 开始时间(时间戳)
* @param integer $end 结束时间(时间戳)
* @param integer $game_id 游戏编号
* @param integer/string $promote_id 渠道编号或渠道编号列表字符串(字符串逗号分隔)
* @param integer $lock_status 用户状态1正常0锁定
* @return array 详细数据
* @author 鹿文学
*/
public function register_list_by_time($start,$end,$game_id,$promote_id,$group='time',$lock_status=1) {
$dateform = '%Y-%m-%d';
$map['fgame_id'] = $game_id>0?$game_id:array('egt',0);
$map['promote_id'] = is_numeric($promote_id)?$promote_id:array('in',$promote_id);
$map['register_time'] = array('between',array($start,$end));
$map['puid'] = 0;
if(is_numeric($lock_status) && ($lock_status==1 or $lock_status==0)) {
$map['lock_status']=$lock_status;
}
$data = $this
->field('group_concat(id) as id,FROM_UNIXTIME(register_time,"'.$dateform.'") as '.$group)
->where($map)->group($group)->select();
return $data;
}
/**
* 按照时间分组统计注册编号序列
* @param string $newslist 新玩家序列
* @param integer $end 结束时间(时间戳)
* @param integer $game_id 游戏编号
* @param integer/string $promote_id 渠道编号或渠道编号列表字符串(字符串逗号分隔)
* @param integer $flag 留存类型
* @return array 详细数据
* @author 鹿文学
*/
public function ratention_rate($newslist,$game_id=0,$promote_id=0,$flag=1) {
$map['lock_status']=1;
if($game_id>0) {
$map['up.game_id'] = $game_id;
}
/*$map['up.game_id'] = $game_id>0?$game_id:array('egt',0);*/
/*$map['up.promote_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;
}
}