123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- <?php
- declare (strict_types=1);
- namespace app\store\model\analysis;
- use app\common\model\analysis\AnalysisDailyRetain as AnalysisDailyRetainModel;
- use app\common\model\analysis\AnalysisDailyRetainTag;
- use app\common\service\MpWxService;
- use think\facade\Db;
- /**
- * 每日访问留存模型
- * Class AnalysisDailyRetain
- * @package app\common\model\analysis
- */
- class AnalysisDailyRetain extends AnalysisDailyRetainModel
- {
- /**
- * 批量写入每日行为数据
- * 发布上线时,只需执行一次
- */
- public static function addInitVisit()
- {
- $begin_date = '20211001'; // 生成初始数据开始时间,建议时间为:小程序上线时间
- $end_date = date('Ymd', strtotime('-1 days')); // 生成初始数据结束时间,建议时间为:昨天
- $date_arr = period_date(strtotime($begin_date), strtotime($end_date), 'Ymd');
- Db::startTrans();
- try {
- foreach ($date_arr as $date) {
- $res = self::visit($date);
- self::addData($date, $res);
- }
- Db::commit();
- return true;
- } catch (\Exception $e) {
- Db::rollback();
- return false;
- }
- }
- /**
- * 写入每日行为数据
- * 定时任务每日执行一次,生成昨日数据
- */
- public static function addVisit()
- {
- Db::startTrans();
- try {
- for ($i = 30; $i > 0; $i--) {
- $date = date('Ymd', strtotime("-{$i} days"));
- $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))
- ->where('end_time', '<', strtotime($date) + 86400)
- ->value('id');
- if (!$retain_id) {
- // 不存在 新增
- // 写入访问留存表
- $retain_id = self::insertGetId($data);
- }
- // 写入访问留存标识表
- foreach ($visit_uv_new as $k => &$new) {
- // 判断是否存在
- $tag_info = AnalysisDailyRetainTag::where('retain_id', $retain_id)
- ->where('type', AnalysisDailyRetainTag::TYPE_NEW)
- ->where('key', $new['key'])
- ->count();
- if ($tag_info) { // 存在 跳出循环
- unset($visit_uv_new[$k]);
- continue;
- }
- $new['retain_id'] = $retain_id;
- $new['type'] = AnalysisDailyRetainTag::TYPE_NEW;
- $new['create_time'] = time();
- $new['update_time'] = time();
- }
- AnalysisDailyRetainTag::insertAll($visit_uv_new);
- foreach ($visit_uv as $k => &$active) {
- $tag_info = AnalysisDailyRetainTag::where('retain_id', $retain_id)
- ->where('type', AnalysisDailyRetainTag::TYPE_ACTIVE)
- ->where('key', $new['key'])
- ->count();
- if ($tag_info) { // 存在 跳出循环
- unset($visit_uv[$k]);
- continue;
- }
- $active['retain_id'] = $retain_id;
- $active['type'] = AnalysisDailyRetainTag::TYPE_ACTIVE;
- $active['create_time'] = time();
- $active['update_time'] = time();
- }
- AnalysisDailyRetainTag::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($data['ref_date']); // 开始时间 00:00:00
- $data['end_time'] = strtotime($data['ref_date']) + 86400 - 1; // 结束时间 23:59:59
- return $data;
- }
- /**
- * 获取用户访问小程序数据日留存
- * 限定查询1天数据
- *
- * @param $date
- * @return array|mixed
- */
- private static function getRetain($date)
- {
- $params['begin_date'] = $date;
- $params['end_date'] = $date;
- $data = MpWxService::doAnalysisAction('getweanalysisappiddailyretaininfo', $params);
- return $data;
- }
- }
|