AnalysisWeeklyRetain.php 5.3 KB

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