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;
}
}