| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771 | <?php// +—————————————————————————————————————————————————————————————————————// | Created by Yunbao// +—————————————————————————————————————————————————————————————————————// | Copyright (c) 2013~2022 http://www.yunbaokj.com All rights reserved.// +—————————————————————————————————————————————————————————————————————// | Author: https://gitee.com/yunbaokeji// +—————————————————————————————————————————————————————————————————————// | Date: 2022-02-17// +—————————————————————————————————————————————————————————————————————namespace app\admin\controller;use cmf\controller\AdminBaseController;use think\Db;class MainController extends AdminbaseController {	    public function index(){                $config=getConfigPub();        $this->assign("config",$config);                $nowtime=time();        //当天0点        $today=date("Y-m-d",$nowtime);        $today_start=strtotime($today);        //当天 23:59:59        $today_end=strtotime("{$today} + 1 day");                /* 总注册数 */        $users_total=Db::name('user')->where("user_type=2")->count();        $this->assign("users_total",number_format($users_total));                           	//设备终端        $source=Db::name('user')                ->field("count(id) as nums,source")                ->where("user_type=2")                ->group("source")                ->select()                ->toArray();        $data_source=[            'name'=>[],            'nums'=>[],            'nums_per'=>[],            'color'=>[],        ];        $color=['#99ce87','#5ba1f8','#f4a76d','#99ba64'];        if($source){            $nums=array_column($source,'nums');            $nums_totoal=array_sum($nums);                        foreach($source as $k=>$v){                $data_source['name'][]=$v['source'];                $data_source['nums'][]=$v['nums'];                $data_source['color'][]=$color[$k];                $data_source['nums_per'][]=round($v['nums']*100/$nums_totoal);            }        }                $this->assign("data_sourcej",json_encode($data_source));        /* 注册渠道 */        $login_type=Db::name('user')                ->field("count(id) as nums,login_type")                ->where("user_type=2")                ->group("login_type")                ->order("nums desc")                ->select()                ->toArray();        $data_type=[            'name'=>[],            'v_n'=>[],        ];        $color_v_n=['#0972f4','#3289f6','#65a6f7','#8dbdf9','#b7d1f2'];        if($login_type){            foreach($login_type as $k=>$v){                $data_type['v_n'][]=['value'=>$v['nums'],'name'=>$v['login_type'],'itemStyle'=>['color'=>$color_v_n[$k]]];                $data_type['name'][]=$v['login_type'];            }        }                $this->assign("data_typej",json_encode($data_type));                        /* 主播数据 */        $anchor_total=Db::name('user')->where("user_type=2")->count();        $anchor_online=Db::name('live')->where("islive=1")->count();        $anchor_live_long_total=Db::query("select sum(endtime - starttime) as times from cmf_live_record");        //$anchor_live_long_total=Db::name('live_record')->sum("endtime - starttime");        $times=0;        if($anchor_live_long_total){            $times=$anchor_live_long_total[0]['times'];        }        if($times>0){            $times=number_format(floor($times/60));        }                $anchorinfo=$this->getAnchorInfo($today_start,$today_end);        $anchor=[            'anchor_total'=>$anchor_total,            'anchor_online'=>$anchor_online,            'anchor_live_long_total'=>$times,        ];                $anchor=array_merge($anchor,$anchorinfo);        $this->assign("anchor",$anchor);                        /* 网红榜 */        $votes_list=Db::name('user')                    ->field("id,user_nicename,avatar,avatar_thumb,votestotal")                    ->where("user_type=2")                    ->order("votestotal desc")                    ->limit(0,3)                    ->select()                    ->toArray();        foreach($votes_list as $k=>$v){            $v['avatar']=get_upload_path($v['avatar']);            $v['avatar_thumb']=get_upload_path($v['avatar_thumb']);                        $votes_list[$k]=$v;        }        $this->assign("votes_list",$votes_list);        /* 富豪榜 */        $rich_list=Db::name('user')                    ->field("id,user_nicename,avatar,avatar_thumb,consumption")                    ->where("user_type=2")                    ->order("consumption desc")                    ->limit(0,3)                    ->select()                    ->toArray();        foreach($rich_list as $k=>$v){            $v['avatar']=get_upload_path($v['avatar']);            $v['avatar_thumb']=get_upload_path($v['avatar_thumb']);                        $rich_list[$k]=$v;        }        $this->assign("rich_list",$rich_list);                /* 财务 */        $charge_total=Db::name('charge_user')->where("status=1")->sum("money");        if(!$charge_total){            $charge_total=0;        }        if($charge_total>0){            $charge_total=number_format($charge_total);        }                $data_charge=$this->getCharge($today_start,$today_end);        $this->assign("charge_total",$charge_total);        $this->assign("data_chargej",json_encode($data_charge));                /* 提现 */        $cashinfo=$this->getCash($today_start,$today_end);                $cash_total=Db::name('cash_record')->where("status=1")->sum("money");        if(!$cash_total){            $cash_total=0;        }        if($cash_total>0){            $cash_total=number_format($cash_total);        }                $this->assign("cashinfo",$cashinfo);        $this->assign("cash_total",$cash_total);				$stayinfo=[];								//用户认证待审核数量		$stayinfo['auth_count'] = Db::name('user_auth')->where("status=0")->count();						$this->assign("stayinfo",$stayinfo);        return $this->fetch();    }        public function getdata(){        $rs=['code'=>0,'msg'=>'','info'=>[]];                $data = $this->request->param();                $action=isset($data['action']) ? $data['action']: '';        $type=isset($data['type']) ? $data['type']: '';        $start_time=isset($data['start_time']) ? $data['start_time']: '';        $end_time=isset($data['end_time']) ? $data['end_time']: '';        $basic_type=isset($data['basic_type']) ? $data['basic_type']: '';                $start=0;        $end=time();        if($type!=0){            $nowtime=time();            //当天0点            $today=date("Ymd",$nowtime);            $today_start=strtotime($today);            //当天 23:59:59            $today_end=strtotime("{$today} + 1 day");            switch($type){                case '1';                    /* 今日 */                    $start=$today_start;                    $end=$today_end;                    break;                case '2';                    /* 昨日 */                    $yesterday_start=$today_start - 60*60*24;                    $yesterday_end=$today_start;                                        $start=$yesterday_start;                    $end=$yesterday_end;                    break;                case '3';                    /* 近7日 */                    $week_start=$today_end - 60*60*24*7;                    $week_end=$today_end;                                        $start=$week_start;                    $end=$week_end;                    break;                case '4';                    /* 近30日 */                    $month_start=$today_end - 60*60*24*30;                    $month_end=$today_end;                                        $start=$month_start;                    $end=$month_end;                    break;            }                    }else{            if($start_time){                $start=strtotime($start_time);            }            if($end_time){              $end=strtotime($end_time) + 60*60*24;              }        }        if(!$start){            $rs['code']='1001';            $rs['msg']='请选择开始时间';            echo json_encode($rs);            exit;        }        switch($action){            case '3':                $info=$this->getAnchorInfo($start,$end);                break;            case '4':                $info=$this->getCharge($start,$end);                break;            case '5':                $info=$this->getCash($start,$end);                break;        }                $rs['info']=$info;        echo json_encode($rs);        exit;    }            /* 主播数据 */    protected function getAnchorInfo($start,$end){        $anchor_today=Db::name('live_record')->where("starttime >= {$start} and starttime<{$end}")->group("uid")->count();        if(!$anchor_today){            $anchor_today=0;        }        $anchor_live_today=Db::name('live_record')->where("starttime >= {$start} and starttime<{$end}")->count();                $anchor_live_long_today=Db::query("select sum(endtime - starttime) as times from cmf_live_record where starttime >= {$start} and starttime<{$end}");        $times=0;        if($anchor_live_long_today){            $times=$anchor_live_long_today[0]['times'];        }        if($times>0){            $times=number_format(floor($times/60));        }        $info=[            'anchor_today'=>$anchor_today,            'anchor_live_today'=>$anchor_live_today,            'anchor_live_long_today'=>$times,        ];        return $info;    }        /* 财务 */    protected function getCharge($start,$end){        $data_charge=[            'name'=>[],            'money'=>[],            'color'=>[],        ];        $charge_type=[            '1'=>'支付宝',            '2'=>'微信',            '3'=>'苹果支付',        ];        $charge_ambient=[            '1'=>[                '0'=>'APP',                '1'=>'PC',            ],            '2'=>[                '0'=>'APP',                '1'=>'公众号',                '2'=>'PC',            ],            '3'=>[                '0'=>'沙盒',                '1'=>'生产',            ],        ];        $charge_color=['#f44957','#5bc189','#33c5f1','#f8c299'];        $charge_total_today=Db::name('charge_user')->where("status=1 and addtime>={$start} and addtime<{$end}")->sum("money");        if(!$charge_total_today){            $charge_total_today=0;        }                $data_charge['color']=$charge_color;        $data_charge['name'][]='充值总额';        $data_charge['money'][]=$charge_total_today;        foreach($charge_type as $k=>$v){            $data_charge['name'][]=$v;            $money=Db::name('charge_user')->where("status=1 and type={$k} and addtime>={$start} and addtime<{$end}")->sum("money");            if(!$money){                $money=0;            }                        $data_charge['money'][]=$money;                    }                return $data_charge;      }        /* 提现 */    protected function getCash($start,$end){        $cash_apply=Db::name('cash_record')->where("status=0 and addtime>={$start} and addtime<{$end}")->sum("money");        if(!$cash_apply){            $cash_apply=0;        }        if($cash_apply>0){            $cash_apply=number_format($cash_apply);        }                $cash_adopt=Db::name('cash_record')->where("status=1 and addtime>={$start} and addtime<{$end}")->sum("money");        if(!$cash_adopt){            $cash_adopt=0;        }        if($cash_adopt>0){            $cash_adopt=number_format($cash_adopt);        }                $cash_anchor=Db::name('cash_record')->where("addtime>={$start} and addtime<{$end}")->group("uid")->count();        if(!$cash_anchor){            $cash_anchor=0;        }        if($cash_anchor>0){            $cash_anchor=number_format($cash_anchor);        }                $info=[            'cash_apply'=>$cash_apply,            'cash_adopt'=>$cash_adopt,            'cash_anchor'=>$cash_anchor,        ];        return $info;            }        /* 导出 */    function export(){        $data = $this->request->param();                $action=isset($data['action']) ? $data['action']: '';        $type=isset($data['type']) ? $data['type']: '';        $start_time=isset($data['start_time']) ? $data['start_time']: '';        $end_time=isset($data['end_time']) ? $data['end_time']: '';        $basic_type=isset($data['basic_type']) ? $data['basic_type']: '';                $start=0;        $end=time();        if($type!=0){            $nowtime=time();            //当天0点            $today=date("Ymd",$nowtime);            $today_start=strtotime($today);            //当天 23:59:59            $today_end=strtotime("{$today} + 1 day");            switch($type){                case '1';                    /* 今日 */                    $start=$today_start;                    $end=$today_end;                    break;                case '2';                    /* 昨日 */                    $yesterday_start=$today_start - 60*60*24;                    $yesterday_end=$today_start;                                        $start=$yesterday_start;                    $end=$yesterday_end;                    break;                case '3';                    /* 近7日 */                    $week_start=$today_end - 60*60*24*7;                    $week_end=$today_end;                                        $start=$week_start;                    $end=$week_end;                    break;                case '4';                    /* 近30日 */                    $month_start=$today_end - 60*60*24*30;                    $month_end=$today_end;                                        $start=$month_start;                    $end=$month_end;                    break;            }                    }else{            if($start_time){                $start=strtotime($start_time);            }            if($end_time){                $end=strtotime($end_time) + 60*60*24;              }        }                if($start==0){            exit;        }                $xlsData=[];        switch($action){            case '1':                $starttime=$start;                $endtime=$end;                $start=date("Y-m-d",$starttime);                $end=date("Y-m-d",($endtime - 60*60*24));                $congifpri=getConfigPri();                if($start == $end){                    $periodType='hourly';                    $title='  基本指标    '.$start;                                        $date=['00:00','01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00',];                }else{                    $periodType='daily';                    $title='  基本指标    '.$start.'至'.$end;                }                $xlsName  = "  基本指标导出";                $cellName = array('A','B','C','D','E');                                $xlsCell  = array('date','newUsers','launches','duration','activityUsers');                                $xlsData[]=[                    'date'=>$title,                    'newUsers'=>'',                    'launches'=>'',                    'duration'=>'',                    'activityUsers'=>'',                    'ismerge'=>'1',                ];                                $xlsData[]=[                    'date'=>'时间',                    'newUsers'=>'新注册用户(位)',                    'launches'=>'APP启动次数(次)',                    'duration'=>'平均使用时长( 分钟)',                    'activityUsers'=>'活跃用户数(位)',                    'ismerge'=>'0',                ];                                                if($congifpri['um_appkey_android']){                    $appkey=$congifpri['um_appkey_android'];                    $newusers_android=$this->getNewUsers($appkey,$start,$end,$periodType);                    $launches_android=$this->getLaunches($appkey,$start,$end,$periodType);                    if($periodType!='hourly'){                        $durations_android=$this->getDurations($appkey,$start,$end,$periodType);                      }                                        $activeusers_android=$this->getActiveUsers($appkey,$start,$end,$periodType);                }                                if($congifpri['um_appkey_ios']){                    $appkey=$congifpri['um_appkey_ios'];                    $newusers_ios=$this->getNewUsers($appkey,$start,$end,$periodType);                    $launches_ios=$this->getLaunches($appkey,$start,$end,$periodType);                    if($periodType!='hourly'){                        $durations_ios=$this->getDurations($appkey,$start,$end,$periodType);                    }                    $activeusers_ios=$this->getActiveUsers($appkey,$start,$end,$periodType);                }                                                if($periodType!='hourly'){                    for($i=$starttime,$n=0;$i<$endtime;$i+=60*60*24,$n++){                        $newUsers_a=isset($newusers_android[$n]['value'])?$newusers_android[$n]['value']:0;                        $newUsers_i=isset($newusers_ios[$n]['value'])?$newusers_ios[$n]['value']:0;                                                $launches_a=isset($launches_android[$n]['value'])?$launches_android[$n]['value']:0;                        $launches_i=isset($launches_ios[$n]['value'])?$launches_ios[$n]['value']:0;                                                $duration_a=isset($durations_android[$n])?$durations_android[$n]:0;                        $duration_i=isset($durations_ios[$n])?$durations_ios[$n]:0;                                                $activityUsers_a=isset($activeusers_android[$n]['value'])?$activeusers_android[$n]['value']:0;                        $activityUsers_i=isset($activeusers_ios[$n]['value'])?$activeusers_ios[$n]['value']:0;                                                                        $info=[];                        $info['date']=date("Y-m-d",$i);                        $info['newUsers']=$newUsers_a + $newUsers_i;                        $info['launches']=$launches_a + $launches_i;                        $info['duration']=floor( ($duration_a + $duration_i)/60);                        $info['activityUsers']=$activityUsers_a + $activityUsers_i;                        $info['ismerge']='0';                        $xlsData[]=$info;                    }                                        }else{                    for($n=0;$n<24;$n++){                                                $newUsers_a=isset($newusers_android[0]['hourValue'][$n])?$newusers_android[0]['hourValue'][$n]:0;                        $newUsers_i=isset($newusers_ios[0]['hourValue'][$n])?$newusers_ios[0]['hourValue'][$n]:0;                                                $launches_a=isset($launches_android[0]['hourValue'][$n])?$launches_android[0]['hourValue'][$n]:0;                        $launches_i=isset($launches_ios[0]['hourValue'][$n])?$launches_ios[0]['hourValue'][$n]:0;                                                                        $activityUsers_a=isset($activeusers_android[0]['hourValue'][$n])?$activeusers_android[0]['hourValue'][$n]:0;                        $activityUsers_i=isset($activeusers_ios[0]['hourValue'][$n])?$activeusers_ios[0]['hourValue'][$n]:0;                                                $info=[];                        $info['date']=$date[$n];                        $info['newUsers']=$newUsers_a + $newUsers_i;                        $info['launches']=$launches_a + $launches_i;                        $info['duration']=0;                        $info['activityUsers']=$activityUsers_a + $activityUsers_i;                        $info['ismerge']='0';                        $xlsData[]=$info;                    }                 }                break;            case '2':                //$info=$this->getUsers($start,$end);                break;            case '3':                                          $anchor_live_long_today=Db::query("select sum(endtime - starttime) as times from cmf_live_record");                $times=0;                if($anchor_live_long_today){                    $times=$anchor_live_long_today[0]['times'];                }                if($times>0){                    $times=number_format(floor($times/60));                }                        $xlsName  = "主播数据导出";                $cellName = array('A','B','C','D','E');                                $xlsCell  = array('date','anchor_today','anchor_live_today','anchor_live_long_today');                                $xlsData[]=[                    'date'=>'总直播时长    '.$times.' 分钟',                    'anchor_today'=>'',                    'anchor_live_today'=>'',                    'anchor_live_long_today'=>'',                    'ismerge'=>'1',                ];                                $xlsData[]=[                    'date'=>date("Y-m-d",$start).'至'.date("Y-m-d",($end-1)),                    'anchor_today'=>'',                    'anchor_live_today'=>'',                    'anchor_live_long_today'=>'',                    'ismerge'=>'1',                ];                                $xlsData[]=[                    'date'=>'时间',                    'anchor_today'=>'开播主播数量(位)',                    'anchor_live_today'=>'直播次数( 次)',                    'anchor_live_long_today'=>'直播时长(分钟)',                    'ismerge'=>'0',                ];                                for($i=$start;$i<$end;$i+=60*60*24){                    $i2=$i+60*60*24;                    $info=$this->getAnchorInfo($i,$i2);                    $info['date']=date("Y-m-d",$i);                    $info['ismerge']='0';                    $xlsData[]=$info;                }                                break;            case '4':                            $xlsName  = "财务导出";                $cellName = array('A','B','C','D','E');                                $charge_total=Db::name('charge_user')->where("status=1")->sum("money");                if(!$charge_total){                    $charge_total=0;                }                if($charge_total>0){                    $charge_total=number_format($charge_total);                }                                $xlsCell  = array('date','total','ali','wx','apple');                                $xlsData[]=[                    'date'=>'历史总收益    '.$charge_total.' 元',                    'total'=>'',                    'ali'=>'',                    'wx'=>'',                    'apple'=>'',                    'ismerge'=>'1',                ];                                $xlsData[]=[                    'date'=>date("Y-m-d",$start).'至'.date("Y-m-d",($end-1)),                    'total'=>'',                    'ali'=>'',                    'wx'=>'',                    'apple'=>'',                    'ismerge'=>'1',                ];                                $xlsData[]=[                    'date'=>'时间',                    'total'=>'充值金额(元)',                    'ali'=>'支付宝充值( 元)',                    'wx'=>'微信充值(元)',                    'apple'=>'苹果充值( 元)',                    'ismerge'=>'0',                ];                                for($i=$start;$i<$end;$i+=60*60*24){                    $i2=$i+60*60*24;                    $char_info=$this->getCharge($i,$i2);                    $info=[];                    $info['date']=date("Y-m-d",$i);                    $info['total']=$char_info['money'][0];                    $info['ali']=$char_info['money'][1];                    $info['wx']=$char_info['money'][2];                    $info['apple']=$char_info['money'][3];                    $info['ismerge']='0';                    $xlsData[]=$info;                }                break;            case '5':                $xlsName  = "提现导出";                $cellName = array('A','B','C','D');                                $cash_total=Db::name('cash_record')->where("status=1")->sum("money");                if(!$cash_total){                    $cash_total=0;                }                if($cash_total>0){                    $cash_total=number_format($cash_total);                }                                $xlsCell  = array('date','cash_apply','cash_adopt','cash_anchor');                                $xlsData[]=[                    'date'=>'总提现金额    '.$cash_total.' 元',                    'cash_apply'=>'',                    'cash_adopt'=>'',                    'cash_anchor'=>'',                    'ismerge'=>'1',                ];                                $xlsData[]=[                    'date'=>date("Y-m-d",$start).'至'.date("Y-m-d",($end-1)),                    'cash_apply'=>'',                    'cash_adopt'=>'',                    'cash_anchor'=>'',                    'ismerge'=>'1',                ];                                $xlsData[]=[                    'date'=>'时间',                    'cash_apply'=>'申请金额(元)',                    'cash_adopt'=>'已通过金额(元)',                    'cash_anchor'=>'主播提现数量( 位)',                    'ismerge'=>'0',                ];                                for($i=$start;$i<$end;$i+=60*60*24){                    $i2=$i+60*60*24;                    $info=$this->getCash($i,$i2);                    $info['date']=date("Y-m-d",$i);                    $info['ismerge']='0';                    $xlsData[]=$info;                }                break;        }                $this->exportExcel($xlsName,$xlsCell,$xlsData,$cellName);        }    	/**导出Excel 表格   * @param $expTitle 名称   * @param $expCellName 参数   * @param $expTableData 内容   * @throws \PHPExcel_Exception   * @throws \PHPExcel_Reader_Exception   */	protected function exportExcel($xlsName,$expCellName,$expTableData,$cellName)	{		$xlsTitle = iconv('utf-8', 'gb2312', $xlsName);//文件名称		$fileName = $xlsTitle.'_'.date('YmdHis');//or $xlsTitle 文件名称可根据自己情况设定		$cellNum = count($expCellName);		$dataNum = count($expTableData);		        $path= CMF_ROOT.'sdk/PHPExcel/';        require_once( $path ."PHPExcel.php");        		$objPHPExcel = new \PHPExcel();        $objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(20);		for($i=0;$i<$dataNum;$i++){            $cellinfo=$expTableData[$i];            if($cellinfo['ismerge']==1){                $objPHPExcel->getActiveSheet()->mergeCells('A'.($i+1).':'.end($cellName).($i+1));//合并单元格(如果要拆分单元格是需要先合并再拆分的,否则程序会报错)                                $objPHPExcel->getActiveSheet(0)->setCellValue('A'.($i+1), $cellinfo[$expCellName[0]]);            }else{                for($j=0;$j<$cellNum;$j++){                    $key=$expCellName[$j];                    $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+1), $cellinfo[$key]);                }            }					}		header('pragma:public');		header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');		header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新窗口打印inline本窗口打印		$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');//Excel5为xls格式,excel2007为xlsx格式		$objWriter->save('php://output');		exit;	}    }
 |