123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- <?php
- declare (strict_types=1);
- namespace app\store\controller\analysis;
- use app\store\controller\Controller;
- use app\store\model\analysis\AnalysisDailyVisit;
- use app\store\model\analysis\AnalysisMonthlyVisit;
- use app\store\model\analysis\AnalysisWeeklyVisit;
- use app\common\service\Export as ExportService;
- /**
- * 行为分析
- *
- * Class Behavior
- * @package app\store\controller\analysis
- */
- class Behavior extends Controller
- {
- //行为数据导出
- public function exportBehaviorTrend(){
- $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);
- }
- $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;
- }
- }
|