diff --git a/Application/Admin/Controller/StatController.class.php b/Application/Admin/Controller/StatController.class.php index fad630ebd..f8bba8cbb 100644 --- a/Application/Admin/Controller/StatController.class.php +++ b/Application/Admin/Controller/StatController.class.php @@ -1331,26 +1331,28 @@ class StatController extends ThinkController * @author 鹿文学 */ public function device_survey() { - - $device = D('DeviceRecord'); - + 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)); +// $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'); @@ -1362,6 +1364,39 @@ class StatController extends ThinkController } + 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->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 = $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 = $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'))/2); +// $return = second_to_duration($device->single_duration(['create_time'=>array('between',[$todaystart-86400*7,$todaystart-1])])/7); + } + + $this->ajaxReturn($return?$return:0) ; + } + /* * 折线图 @@ -1399,14 +1434,19 @@ class StatController extends ThinkController $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 = $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 = $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 = $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) { @@ -1445,15 +1485,68 @@ class StatController extends ThinkController $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 = $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 = $device->active_on_time(['create_time'=>['between',[$starttime,$endtime]]],'active',$num==7?2:1,'time,version'); + $active = $activeData; // 启动机型 - $model = $device->model(['create_time'=>['between',[$starttime,$endtime]]]); + $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) { diff --git a/Application/Admin/Controller/TimingController.class.php b/Application/Admin/Controller/TimingController.class.php new file mode 100644 index 000000000..a51234317 --- /dev/null +++ b/Application/Admin/Controller/TimingController.class.php @@ -0,0 +1,192 @@ + +// +---------------------------------------------------------------------- + +namespace Admin\Controller; +use User\Api\UserApi as UserApi; + +/** + * 后台首页控制器 + * @author 麦当苗儿 + */ +class TimingController extends AdminController { + + public function _initialize(){ + } + + public function caculateDeviceInfo() { + + $start = 1569686400; + $end = time(); + + if (I('time')) { + $start = strtotime(I('time')); + $end = $start+1; + } + + if (I('start')) { + $start = strtotime(I('start')); + } + + ini_set('memory_limit','1024M'); +// $device = D('DeviceRecord'); +// echo 1; + for($startTime = $start;$startTime<$end;$startTime=$startTime+86400) { + echo date("Y-m-d",$startTime).' 安卓 '; + //当日新增设备 + $newSql = M('device_record','tab_')->field('min(create_time) as create_time,model,unique_code,id')->where(['version'=>1])->group('unique_code')->select(false); + $data['new_device'] = M('device_record','tab_')->table('(' . $newSql . ') as a')->where(['create_time'=>array('between',[$startTime,$startTime+86399])])->order('create_time')->count(); + + echo $data['new_device'].' '; + //当日活跃设备 + $data['active_device'] = $this->active(['create_time'=>array('between',[$startTime,$startTime+86399]),'version'=>1]); + echo $data['active_device'].' '; + $data['time'] = $startTime; + $data['version'] = 1; + + $data['today_new_device'] =json_encode($this->news_on_time(['create_time'=>['between',[$startTime,$startTime+86399]]],'news',5,'time,version','time',1)); + +// echo M('device_record','tab_')->_sql()."\n"; + $data['today_active_device'] =json_encode($this->active_on_time(['create_time'=>['between',[$startTime,$startTime+86399]],'version'=>1],'active',5,'time,version')); +// echo M('device_record','tab_')->_sql()."\n"; + $data['today_model_device'] = json_encode($this->model(['create_time'=>['between',[$startTime,$startTime+86399]],'version'=>1])); + + $data['model'] = json_encode($this->modelDevice(['create_time'=>['between',[$startTime,$startTime+86399]],'version'=>1])); + + $duration = $this->duration(['create_time'=>array('between',[$startTime-86400*7,$startTime-1]),'version'=>1]); + $data['duration7'] = ($duration/M('device_record','tab_')->table('(' . $newSql . ') as a')->where(['create_time'=>array('between',[$startTime-86400*7,$startTime-1])])->order('create_time')->count())/7; + + $getStatistics = M('device_statistics','tab_')->where(['time'=>$startTime,'version'=>1])->find(); + echo "\n"; + if (!$getStatistics) { + M('device_statistics','tab_')->add($data); + } else { + M('device_statistics','tab_')->where(['time'=>$startTime,'version'=>1])->save($data); + } + + echo date("Y-m-d",$startTime).' 苹果 '; + //当日新增设备 + $newSql = M('device_record','tab_')->field('min(create_time) as create_time,model,unique_code,id')->where(['version'=>2])->group('unique_code')->select(false); + $data['new_device'] = M('device_record','tab_')->table('(' . $newSql . ') as a')->where(['create_time'=>array('between',[$startTime,$startTime+86399])])->order('create_time')->count(); + + echo $data['new_device'].' '; + //当日活跃设备 + $data['active_device'] = $this->active(['create_time'=>array('between',[$startTime,$startTime+86399]),'version'=>2]); + echo $data['active_device'].' '; + $data['time'] = $startTime; + $data['version'] = 2; + echo 0; + $data['today_new_device'] =json_encode($this->news_on_time(['create_time'=>['between',[$startTime,$startTime+86399]]],'news',5,'time,version','time',2)); +// echo M('device_record','tab_')->_sql();die(); + echo 1; + $data['today_active_device'] =json_encode($this->active_on_time(['create_time'=>['between',[$startTime,$startTime+86399]],'version'=>2],'active',5,'time,version')); + echo 2; + $data['today_model_device'] = json_encode($this->model(['create_time'=>['between',[$startTime,$startTime+86399]],'version'=>2])); + echo 3; + + $data['model'] = json_encode($this->modelDevice(['create_time'=>['between',[$startTime,$startTime+86399]],'version'=>2])); + + $duration = $this->duration(['create_time'=>array('between',[$startTime-86400*7,$startTime-1]),'version'=>2]); + $data['duration7'] = ($duration/M('device_record','tab_')->table('(' . $newSql . ') as a')->where(['create_time'=>array('between',[$startTime-86400*7,$startTime-1])])->order('create_time')->count())/7; + echo 4; + $getStatistics = M('device_statistics','tab_')->where(['time'=>$startTime,'version'=>2])->find(); + echo "\n"; + if (!$getStatistics) { + M('device_statistics','tab_')->add($data); + } else { + M('device_statistics','tab_')->where(['time'=>$startTime,'version'=>2])->save($data); + } + + + } + + } + + public function duration($map=array()) { + + return M('device_record','tab_')->where($map)->sum('duration'); + + } + + public function active($map=array()) { + + $sql = M('device_record','tab_')->field('create_time,model,unique_code')->where($map)->select(false); + + $sql = M('device_record','tab_')->table('(' . $sql . ') as a')->group('unique_code')->order('create_time')->select(false); + + $sql = "select count(*) as count from ({$sql})t"; + + $count = M('device_record','tab_')->query($sql); + + return $count[0]['count']; + + } + + public function news_on_time($map=array(),$field='news',$flag=1,$group='time',$order='time',$version = 1) { + + switch($flag) { + case 2:{$dateform = '%Y-%m';};break; + case 3:{$dateform = '%Y-%u';};break; + case 4:{$dateform = '%Y';};break; + case 5:{$dateform = '%Y-%m-%d %H';};break; + default:$dateform = '%Y-%m-%d'; + } + + $sql = M('device_record','tab_')->field('min(create_time) as create_time,version,unique_code,id')->where(['version'=>$version])->group('unique_code')->select(false); + + $news = M('device_record','tab_')->table('(' . $sql . ') as a') + ->field('FROM_UNIXTIME(a.create_time, "'.$dateform.'") as '.$group.',group_concat(a.id) as id,group_concat(a.unique_code) as unique_code ,COUNT(a.unique_code) AS '.$field) + ->where($map)->group($group)->order($order)->select(); +// echo M('device_record','tab_')->_sql();die(); + return $news; + + } + + public function active_on_time($map=array(),$field='active',$flag=1,$group='time',$order='time') { + + switch($flag) { + case 2:{$dateform = '%Y-%m';};break; + case 3:{$dateform = '%Y-%u';};break; + case 4:{$dateform = '%Y';};break; + case 5:{$dateform = '%Y-%m-%d %H';};break; + default:$dateform = '%Y-%m-%d'; + } + + + $sql = M('device_record','tab_')->field('create_time,version,unique_code,id')->where($map)->select(false); + + $mid = M('device_record','tab_')->table('(' . $sql . ') as m')->group('unique_code')->select(false); + + $active = M('device_record','tab_')->table('(' . $mid . ') as a') + ->field('FROM_UNIXTIME(a.create_time, "'.$dateform.'") as '.$group.',group_concat(a.id) as id,group_concat(a.unique_code) as unique_code ,COUNT(a.unique_code) AS '.$field) + ->group($group)->order($order)->select(); +// echo $this->_sql();die(); + return $active; + + } + + public function model($map=array()) { + + $sql = M('device_record','tab_')->field('create_time,model,version,unique_code')->where($map)->select(false); + + + $mid = M('device_record','tab_')->table('(' .$sql. ') as m')->group('unique_code')->select(false); + + return M('device_record','tab_')->table('(' .$mid. ') as a')->field('a.model,version,count(a.unique_code) as count')->group('model,version')->order('count desc')->select(); + + } + + public function modelDevice($map=array()) { + $sql = M('device_record','tab_')->field('model,version,unique_code')->where($map)->select(false); + + $mid = M('device_record','tab_')->table('(' .$sql. ') as m')->group('unique_code')->select(); + + return $mid; + } + +} diff --git a/Application/Admin/Model/DeviceRecordModel.class.php b/Application/Admin/Model/DeviceRecordModel.class.php index 1398828e1..ed4aafeb6 100644 --- a/Application/Admin/Model/DeviceRecordModel.class.php +++ b/Application/Admin/Model/DeviceRecordModel.class.php @@ -46,10 +46,13 @@ class DeviceRecordModel extends Model{ * @author 鹿文学 */ public function all_device() { - - $list = $this->field('min(create_time) as create_time,unique_code')->group('unique_code')->select(); - - return count($list); + +// $list = $this->field('unique_code')->group('unique_code')->count(); + $sql = "SELECT count(1) as count from (select unique_code from tab_device_record group by unique_code)t;"; + + $list = $this->query($sql); + + return $list[0]['count']; } @@ -60,7 +63,7 @@ class DeviceRecordModel extends Model{ public function total_device($map=array(),$flag=0) { if($flag) { - $list = $this->active($map); + $list = $this->active($map); } else { $list = $this->news($map); } @@ -76,7 +79,7 @@ class DeviceRecordModel extends Model{ public function news($map=array()) { $sql = $this->field('min(create_time) as create_time,model,unique_code,id')->group('unique_code')->select(false); - + return $this->table('(' . $sql . ') as a')->where($map)->order('create_time')->select(); } @@ -89,7 +92,7 @@ class DeviceRecordModel extends Model{ * @author 鹿文学 */ public function news_on_time($map=array(),$field='news',$flag=1,$group='time',$order='time') { - + switch($flag) { case 2:{$dateform = '%Y-%m';};break; case 3:{$dateform = '%Y-%u';};break; @@ -97,13 +100,13 @@ class DeviceRecordModel extends Model{ case 5:{$dateform = '%Y-%m-%d %H';};break; default:$dateform = '%Y-%m-%d'; } - + $sql = $this->field('min(create_time) as create_time,version,unique_code,id')->group('unique_code')->select(false); $news = $this->table('(' . $sql . ') as a') ->field('FROM_UNIXTIME(a.create_time, "'.$dateform.'") as '.$group.',group_concat(a.id) as id,group_concat(a.unique_code) as unique_code ,COUNT(a.unique_code) AS '.$field) ->where($map)->group($group)->order($order)->select(); - + return $news; } @@ -145,7 +148,7 @@ class DeviceRecordModel extends Model{ $active = $this->table('(' . $mid . ') as a') ->field('FROM_UNIXTIME(a.create_time, "'.$dateform.'") as '.$group.',group_concat(a.id) as id,group_concat(a.unique_code) as unique_code ,COUNT(a.unique_code) AS '.$field) ->group($group)->order($order)->select(); - +// echo $this->_sql();die(); return $active; } @@ -160,6 +163,7 @@ class DeviceRecordModel extends Model{ $mid = $this->table('(' .$sql. ') as m')->group('unique_code')->select(false); +// echo $this->_sql();die(); return $this->table('(' .$mid. ') as a')->field('a.model,version,count(a.unique_code) as count')->group('model,version')->order('count desc')->select(); diff --git a/Application/Admin/View/Stat/device_survey.html b/Application/Admin/View/Stat/device_survey.html index 4374e3b85..646ea95df 100644 --- a/Application/Admin/View/Stat/device_survey.html +++ b/Application/Admin/View/Stat/device_survey.html @@ -81,33 +81,33 @@
-
- {$today|default=0} 今日新增设备 +
+ 加载中... 今日新增设备
-
- {$yesterday|default=0} 昨日新增设备 +
+ 加载中... 昨日新增设备
-
- {$total|default=0} 累计设备 +
+ 加载中... 累计设备
-
- {$day7|default=0} 近7日活跃设备 +
+ 加载中... 近7日活跃设备
-
- {$day30|default=0} 近30日活跃设备 +
+ 加载中... 近30日活跃设备
-
- {$duration7|default='00:00:00'} 近7日单设备日均使用时长 +
+ 加载中... 近7日单设备日均使用时长
@@ -131,7 +131,7 @@
  • 过去整月
  • 过去7天
  • 过去30天
  • -
  • 过去一年
  • +
    @@ -457,7 +457,37 @@