123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- <?php
- declare (strict_types=1);
- namespace app\store\model\analysis;
- use app\common\model\analysis\AnalysisMonthlyRetain as AnalysisMonthlyRetainModel;
- use app\common\model\analysis\AnalysisMonthlyRetainTag;
- use app\common\service\MpWxService;
- use think\facade\Db;
- /**
- * 每月访问留存模型
- * Class AnalysisMonthlyRetain
- * @package app\common\model\analysis
- */
- class AnalysisMonthlyRetain extends AnalysisMonthlyRetainModel
- {
- /**
- * 批量写入每月留存数据
- * 发布上线时,只需执行一次
- */
- public static function addInitVisit()
- {
- $begin_date = strtotime('20211001'); // 生成初始数据开始时间,建议时间为:小程序上线时间
- $end_date = strtotime(date('Ymd', strtotime('-1 days'))); // 生成初始数据结束时间,建议时间为:昨天
- $date_arr = period_month($begin_date, $end_date, true);
- Db::startTrans();
- try {
- foreach ($date_arr as $date) {
- $date = month_first_last($date);
- $res = self::visit($date);
- self::addData($date, $res);
- }
- Db::commit();
- return true;
- } catch (\Exception $e) {
- Db::rollback();
- return false;
- }
- }
- /**
- * 写入每月留存数据
- * 定时任务每日执行一次,生成上月数据
- */
- public static function addVisit()
- {
- try {
- for ($i = 2; $i > 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;
- }
- }
|