AnalysisDailyRetain.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\store\model\analysis;
  4. use app\common\model\analysis\AnalysisDailyRetain as AnalysisDailyRetainModel;
  5. use app\common\model\analysis\AnalysisDailyRetainTag;
  6. use app\common\service\MpWxService;
  7. use think\facade\Db;
  8. /**
  9. * 每日访问留存模型
  10. * Class AnalysisDailyRetain
  11. * @package app\common\model\analysis
  12. */
  13. class AnalysisDailyRetain extends AnalysisDailyRetainModel
  14. {
  15. /**
  16. * 批量写入每日行为数据
  17. * 发布上线时,只需执行一次
  18. */
  19. public static function addInitVisit()
  20. {
  21. $begin_date = '20211001'; // 生成初始数据开始时间,建议时间为:小程序上线时间
  22. $end_date = date('Ymd', strtotime('-1 days')); // 生成初始数据结束时间,建议时间为:昨天
  23. $date_arr = period_date(strtotime($begin_date), strtotime($end_date), 'Ymd');
  24. Db::startTrans();
  25. try {
  26. foreach ($date_arr as $date) {
  27. $res = self::visit($date);
  28. self::addData($date, $res);
  29. }
  30. Db::commit();
  31. return true;
  32. } catch (\Exception $e) {
  33. Db::rollback();
  34. return false;
  35. }
  36. }
  37. /**
  38. * 写入每日行为数据
  39. * 定时任务每日执行一次,生成昨日数据
  40. */
  41. public static function addVisit()
  42. {
  43. Db::startTrans();
  44. try {
  45. for ($i = 30; $i > 0; $i--) {
  46. $date = date('Ymd', strtotime("-{$i} days"));
  47. $data = self::visit($date);
  48. // 写入数据
  49. self::addData($date, $data);
  50. }
  51. Db::commit();
  52. return true;
  53. } catch (\Exception $e) {
  54. Db::rollback();
  55. return false;
  56. }
  57. }
  58. private static function addData($date, $data)
  59. {
  60. $visit_uv_new = $data['visit_uv_new']; // 新增用户留存
  61. $visit_uv = $data['visit_uv']; // 活跃用户留存
  62. unset($data['visit_uv_new'], $data['visit_uv']);
  63. $retain_id = self::where('start_time', '>=', strtotime($date))
  64. ->where('end_time', '<', strtotime($date) + 86400)
  65. ->value('id');
  66. if (!$retain_id) {
  67. // 不存在 新增
  68. // 写入访问留存表
  69. $retain_id = self::insertGetId($data);
  70. }
  71. // 写入访问留存标识表
  72. foreach ($visit_uv_new as $k => &$new) {
  73. // 判断是否存在
  74. $tag_info = AnalysisDailyRetainTag::where('retain_id', $retain_id)
  75. ->where('type', AnalysisDailyRetainTag::TYPE_NEW)
  76. ->where('key', $new['key'])
  77. ->count();
  78. if ($tag_info) { // 存在 跳出循环
  79. unset($visit_uv_new[$k]);
  80. continue;
  81. }
  82. $new['retain_id'] = $retain_id;
  83. $new['type'] = AnalysisDailyRetainTag::TYPE_NEW;
  84. $new['create_time'] = time();
  85. $new['update_time'] = time();
  86. }
  87. AnalysisDailyRetainTag::insertAll($visit_uv_new);
  88. foreach ($visit_uv as $k => &$active) {
  89. $tag_info = AnalysisDailyRetainTag::where('retain_id', $retain_id)
  90. ->where('type', AnalysisDailyRetainTag::TYPE_ACTIVE)
  91. ->where('key', $new['key'])
  92. ->count();
  93. if ($tag_info) { // 存在 跳出循环
  94. unset($visit_uv[$k]);
  95. continue;
  96. }
  97. $active['retain_id'] = $retain_id;
  98. $active['type'] = AnalysisDailyRetainTag::TYPE_ACTIVE;
  99. $active['create_time'] = time();
  100. $active['update_time'] = time();
  101. }
  102. AnalysisDailyRetainTag::insertAll($visit_uv);
  103. }
  104. /**
  105. * 获取单日访问留存数据
  106. *
  107. * @param $date
  108. * @return array
  109. */
  110. public static function visit($date)
  111. {
  112. $data = self::getRetain($date);// 每日访问趋势
  113. $data['create_time'] = time();
  114. $data['update_time'] = time();
  115. $data['start_time'] = strtotime($data['ref_date']); // 开始时间 00:00:00
  116. $data['end_time'] = strtotime($data['ref_date']) + 86400 - 1; // 结束时间 23:59:59
  117. return $data;
  118. }
  119. /**
  120. * 获取用户访问小程序数据日留存
  121. * 限定查询1天数据
  122. *
  123. * @param $date
  124. * @return array|mixed
  125. */
  126. private static function getRetain($date)
  127. {
  128. $params['begin_date'] = $date;
  129. $params['end_date'] = $date;
  130. $data = MpWxService::doAnalysisAction('getweanalysisappiddailyretaininfo', $params);
  131. return $data;
  132. }
  133. }