0; $i--) { $month = date('Y-m', strtotime(date('Y-m-01') . " -{$i} month")); $date = month_first_last($month); $data = self::visit($date); // 写入数据 self::addData($date, $data); } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); return false; } } private static function addData($date, $data) { $visit_uv_new = $data['visit_uv_new']; // 新增用户留存 $visit_uv = $data['visit_uv']; // 活跃用户留存 unset($data['visit_uv_new'], $data['visit_uv']); $retain_id = self::where('start_time', '>=', strtotime($date['s'])) ->where('end_time', '<', strtotime($date['e'])+ 86400) ->value('id'); if (!$retain_id) { // 不存在 新增 // 写入访问留存表 $retain_id = self::insertGetId($data); } // 写入访问留存标识表 foreach($visit_uv_new as $k=>&$new) { $tag_info = AnalysisMonthlyRetainTag::where('retain_id', $retain_id) ->where('type', AnalysisMonthlyRetainTag::TYPE_NEW) ->where('key', $new['key']) ->count(); if ($tag_info) { // 存在 跳出循环 unset($visit_uv_new[$k]); continue; } $new['retain_id'] = $retain_id; $new['type'] = AnalysisMonthlyRetainTag::TYPE_NEW; $new['create_time'] = time(); $new['update_time'] = time(); } AnalysisMonthlyRetainTag::insertAll($visit_uv_new); foreach($visit_uv as $k=>&$active) { $tag_info = AnalysisMonthlyRetainTag::where('retain_id', $retain_id) ->where('type', AnalysisMonthlyRetainTag::TYPE_ACTIVE) ->where('key', $new['key']) ->count(); if ($tag_info) { // 存在 跳出循环 unset($visit_uv[$k]); continue; } $active['retain_id'] = $retain_id; $active['type'] = AnalysisMonthlyRetainTag::TYPE_ACTIVE; $active['create_time'] = time(); $active['update_time'] = time(); } AnalysisMonthlyRetainTag::insertAll($visit_uv); } /** * 获取单月数据概览及访问留存数据 * * @param $date * @return array */ public static function visit($date) { $data = self::getRetain($date);// 每月访问趋势 $data['create_time'] = time(); $data['update_time'] = time(); $data['start_time'] = strtotime($date['s']); // 开始时间 00:00:00 $data['end_time'] = strtotime($date['e']) + 86400 - 1; // 结束时间 23:59:59 return $data; } /** * 获取用户访问小程序数据月趋势 * * @param $date * @return array|mixed */ private static function getRetain($date) { $startDate = date('Ymd', strtotime($date['s'])); $endDate = date('Ymd', strtotime($date['e'])); $params['begin_date'] = $startDate; $params['end_date'] = $endDate; $data = MpWxService::doAnalysisAction('getweanalysisappidmonthlyretaininfo', $params); return $data; } }