request->param(); $type = $params['type'] ?? 2; // 时间筛选类型 1-最近7天 2-最近30天 3-自定义 $comp_type = $params['comp_type'] ?? 0; // 时间对比-时间筛选类型 1-该时段前7日 2-该时段前14日 3-该时段前30日 4-自定义 $start = (int)($params['start'] ?? ''); $end = (int)($params['end'] ?? ''); $comp_start = (int)($params['comp_start'] ?? ''); // 时间对比-开始时间 $comp_end = (int)($params['comp_end'] ?? ''); // 时间对比-结束时间 $grain_size = $params['grain_size'] ?? 1; // 粒度 1-日粒度 2-周粒度 3-月粒度 if ($type == 3 && (!$start || !$end)) { return $this->renderError('自定义区间时间不能为空'); } // 根据时间筛选类型计算筛选开始结束时间 if ($type == 1) { //最近7天 $start = strtotime('-7 days'); $end = strtotime('-1 days'); } elseif ($type == 2) {//最近30天 $start = strtotime('-30 days'); $end = strtotime('-1 days'); } if ($comp_type == 1) {//该时段前7日 $comp_start = strtotime('-7 days', $start); $comp_end = strtotime('-7 days', $end); } elseif ($comp_type == 2) {//该时段前14日 $comp_start = strtotime('-14 days', $start); $comp_end = strtotime('-14 days', $end); } elseif ($comp_type == 3) {//该时段前30日 $comp_start = strtotime('-30 days', $start); $comp_end = strtotime('-30 days', $end); } $start = strtotime(date('Y-m-d', $start)); $end = strtotime(date('Y-m-d', $end)); $comp_start = $comp_start ? strtotime(date('Y-m-d', $comp_start)) : 0; $comp_end = $comp_end ? strtotime(date('Y-m-d', $comp_end)) : 0; $dimensions = self::getDimensions(); $tables = []; $fields = []; $comp_fields = []; if ($grain_size == 1) { $visit_model = new AnalysisDailyVisit(); } elseif ($grain_size == 2) { // 周粒度 // 判断开始时间是否不满一周 if (date("w",$start) != 1) { $start = strtotime('-1 monday', $start); } if ($comp_start && date("w",$comp_start) != 1) { $comp_start = strtotime('-1 monday', $comp_start); } $visit_model = new AnalysisWeeklyVisit(); } elseif ($grain_size == 3) { // 月粒度 // 判断开始时间是否不满一月 if (date("Y-m",$start) == date("Y-m")) { $start = strtotime(last_month('Y-m', 2, $start)); } else { $start = strtotime(last_month('Y-m', 1, $start)); } if ($comp_start && $comp_end){ if (date("Y-m",$comp_start) == date("Y-m")) { $comp_start = strtotime(last_month('Y-m', 2, $comp_start)); } else { $comp_start = strtotime(last_month('Y-m', 1, $comp_start)); } } $visit_model = new AnalysisMonthlyVisit(); } $lists = $visit_model::where('start_time', '>=', $start) ->where('end_time', '<', $end+ 86400) ->order('ref_date', 'asc') ->select()->toArray(); $data['header'] = ['序号', '时间', '打开次数','访问次数','访问人数','新访问人数','人均停留时长','次均停留时长','平均访问深度','累计访问人数','分享人数','分享次数']; $data['filename'] = '用户使用分析'; $data['data'] = []; foreach ($lists as $k=>$arr){ $new_list['key'] = $k+1; $new_list['ref_date'] = $arr['ref_date']; $new_list['session_cnt'] = $arr['session_cnt']; $new_list['visit_pv'] = $arr['visit_pv']; $new_list['visit_uv'] = $arr['visit_uv']; $new_list['visit_uv_new'] = $arr['visit_uv_new']; $new_list['stay_time_uv'] = $arr['stay_time_uv']; $new_list['stay_time_session'] = $arr['stay_time_session']; $new_list['visit_depth'] = $arr['visit_depth']; $new_list['visit_total'] = $arr['visit_total']; $new_list['share_uv'] = $arr['share_uv']; $new_list['share_pv'] = $arr['share_pv']; $data['data'][] = $new_list; } $res = ExportService::export($data['data'],$data['header'],$data['filename'],'列表','Xls'); return $this->renderSuccess($res,'导出成功'); } /* $data = [ [ 'id' => 'session', 'zh' => '打开次数', 'field' => 'session_cnt' ], [ 'id' => 'pv', 'zh' => '访问次数', 'field' => 'visit_pv' ], [ 'id' => 'uv', 'zh' => '访问人数', 'field' => 'visit_uv' ], [ 'id' => 'user_new', 'zh' => '新访问人数', 'field' => 'visit_uv_new' ], [ 'id' => 'staytime_uv', 'zh' => '人均停留时长', 'field' => 'stay_time_uv' ], [ 'id' => 'staytime_session', 'zh' => '次均停留时长', 'field' => 'stay_time_session' ], [ 'id' => 'pagecnt_session', 'zh' => '平均访问深度', 'field' => 'visit_depth' ], [ 'id' => 'total_uv', 'zh' => '累计访问人数', 'field' => 'visit_total' ], [ 'id' => 'share_uv', 'zh' => '分享人数', 'field' => 'share_uv' ], [ 'id' => 'share_pv', 'zh' => '分享次数', 'field' => 'share_pv' ], ]; */ /** * 行为数据 * * @return array */ public function behaviorTrend() { $params = $this->request->param(); $type = $params['type'] ?? 2; // 时间筛选类型 1-最近7天 2-最近30天 3-自定义 $comp_type = $params['comp_type'] ?? 0; // 时间对比-时间筛选类型 1-该时段前7日 2-该时段前14日 3-该时段前30日 4-自定义 $start = (int)($params['start'] ?? ''); $end = (int)($params['end'] ?? ''); $comp_start = (int)($params['comp_start'] ?? ''); // 时间对比-开始时间 $comp_end = (int)($params['comp_end'] ?? ''); // 时间对比-结束时间 $grain_size = $params['grain_size'] ?? 1; // 粒度 1-日粒度 2-周粒度 3-月粒度 if ($type == 3 && (!$start || !$end)) { return $this->renderError('自定义区间时间不能为空'); } // 根据时间筛选类型计算筛选开始结束时间 if ($type == 1) { //最近7天 $start = strtotime('-7 days'); $end = strtotime('-1 days'); } elseif ($type == 2) {//最近30天 $start = strtotime('-30 days'); $end = strtotime('-1 days'); } if ($comp_type == 1) {//该时段前7日 $comp_start = strtotime('-7 days', $start); $comp_end = strtotime('-7 days', $end); } elseif ($comp_type == 2) {//该时段前14日 $comp_start = strtotime('-14 days', $start); $comp_end = strtotime('-14 days', $end); } elseif ($comp_type == 3) {//该时段前30日 $comp_start = strtotime('-30 days', $start); $comp_end = strtotime('-30 days', $end); } $table = $this->getChartTables($start, $end, $grain_size, $comp_start, $comp_end); $data = [ 'start' => date('Y-m-d', $start), 'end' => date('Y-m-d', $end), 'table' => $table ]; if ($comp_start && $comp_end) { $data['comp_start'] = date('Y-m-d', $comp_start); $data['comp_end'] = date('Y-m-d', $comp_end); } return $this->renderSuccess($data); } private function getChartTables($start, $end, $grain_size, $comp_start, $comp_end) { $start = strtotime(date('Y-m-d', $start)); $end = strtotime(date('Y-m-d', $end)); $comp_start = $comp_start ? strtotime(date('Y-m-d', $comp_start)) : 0; $comp_end = $comp_end ? strtotime(date('Y-m-d', $comp_end)) : 0; $dimensions = self::getDimensions(); $tables = []; $fields = []; $comp_fields = []; if ($grain_size == 1) { $visit_model = new AnalysisDailyVisit(); } elseif ($grain_size == 2) { // 周粒度 // 判断开始时间是否不满一周 if (date("w",$start) != 1) { $start = strtotime('-1 monday', $start); } if ($comp_start && date("w",$comp_start) != 1) { $comp_start = strtotime('-1 monday', $comp_start); } $visit_model = new AnalysisWeeklyVisit(); } elseif ($grain_size == 3) { // 月粒度 // 判断开始时间是否不满一月 if (date("Y-m",$start) == date("Y-m")) { $start = strtotime(last_month('Y-m', 2, $start)); } else { $start = strtotime(last_month('Y-m', 1, $start)); } if ($comp_start && $comp_end){ if (date("Y-m",$comp_start) == date("Y-m")) { $comp_start = strtotime(last_month('Y-m', 2, $comp_start)); } else { $comp_start = strtotime(last_month('Y-m', 1, $comp_start)); } } $visit_model = new AnalysisMonthlyVisit(); } $visit = $visit_model::where('start_time', '>=', $start) ->where('end_time', '<', $end+ 86400) ->order('ref_date', 'asc') ->select(); if (!$visit->isEmpty()) { foreach ($visit as $k => $item) { foreach ($dimensions as $kk => $d) { $fields[$kk][] = [ 'ratio' => '', 'refdate' => $item['ref_date'], 'value' => $visit[$k][$d['field']], ]; } } } if ($comp_start && $comp_end) { $comp_visit = $visit_model::where('start_time', '>=', $comp_start) ->where('end_time', '<', $comp_end+ 86400) ->order('ref_date', 'asc') ->select(); if (!$comp_visit->isEmpty()) { foreach ($comp_visit as $k => $item) { foreach ($dimensions as $kk => $d) { $comp_fields[$kk][] = [ 'ratio' => '', 'refdate' => $item['ref_date'], 'value' => $comp_visit[$k][$d['field']], ]; } } } } foreach ($dimensions as $kk => $d) { if ($fields) { $tables[$kk] = [ 'count' => 0, 'id' => $d['id'], 'lines' => [ [ 'dim' => '', 'dimZh' => '', 'fields' => $fields[$kk], ] ], 'zh' => $d['zh'], ]; } if ($comp_fields) { $tables[$kk]['lines'][1] = [ 'dim' => 'compare', 'dimZh' => '时间对比', 'fields' => $comp_fields[$kk], ]; } } return $tables; } /** * 获取统计维度 * * @return array */ private static function getDimensions() { $data = [ [ 'id' => 'session', 'zh' => '打开次数', 'field' => 'session_cnt' ], [ 'id' => 'pv', 'zh' => '访问次数', 'field' => 'visit_pv' ], [ 'id' => 'uv', 'zh' => '访问人数', 'field' => 'visit_uv' ], [ 'id' => 'user_new', 'zh' => '新访问人数', 'field' => 'visit_uv_new' ], [ 'id' => 'staytime_uv', 'zh' => '人均停留时长', 'field' => 'stay_time_uv' ], [ 'id' => 'staytime_session', 'zh' => '次均停留时长', 'field' => 'stay_time_session' ], [ 'id' => 'pagecnt_session', 'zh' => '平均访问深度', 'field' => 'visit_depth' ], [ 'id' => 'total_uv', 'zh' => '累计访问人数', 'field' => 'visit_total' ], [ 'id' => 'share_uv', 'zh' => '分享人数', 'field' => 'share_uv' ], [ 'id' => 'share_pv', 'zh' => '分享次数', 'field' => 'share_pv' ], ]; return $data; } }