AnalysisPageVisit.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\store\model\analysis;
  4. use app\common\model\analysis\AnalysisPageVisit as AnalysisPageVisitModel;
  5. use app\common\service\MpWxService;
  6. use think\facade\Log;
  7. /**
  8. * 页面访问模型
  9. * Class AnalysisPageVisit
  10. * @package app\common\model\analysis
  11. */
  12. class AnalysisPageVisit extends AnalysisPageVisitModel
  13. {
  14. /**
  15. * 批量写入每日页面访问数据
  16. * 发布上线时,只需执行一次
  17. */
  18. public static function addInitVisit()
  19. {
  20. $begin_date = '20211001'; // 生成初始数据开始时间,建议时间为:小程序上线时间
  21. $end_date = date('Ymd', strtotime('-1 days')); // 生成初始数据结束时间,建议时间为:昨天
  22. $date_arr = period_date(strtotime($begin_date), strtotime($end_date), 'Ymd');
  23. foreach ($date_arr as $date) {
  24. $rs = self::visit($date);
  25. if ($rs) {
  26. // 写入数据
  27. $ret = AnalysisPageVisit::insertAll($rs);
  28. if (!$ret) {
  29. Log::error('页面访问数据初始化执行失败 ----' . $date);
  30. return false;
  31. }
  32. }
  33. }
  34. return true;
  35. }
  36. /**
  37. * 写入每日行为数据
  38. * 定时任务每日执行一次,生成昨日数据
  39. */
  40. public static function addVisit()
  41. {
  42. $date = date('Ymd', strtotime('-1 days'));
  43. $data = self::visit($date);
  44. // dd($data);
  45. // 移除数据
  46. self::where('start_time', '>=', strtotime($date))
  47. ->where('end_time', '<', strtotime($date) + 86400)->delete();
  48. // 写入数据
  49. return AnalysisPageVisit::insertAll($data);
  50. }
  51. /**
  52. * 获取单日用户访问页面数据
  53. *
  54. * @param $date
  55. * @return array
  56. */
  57. public static function visit($date)
  58. {
  59. $data = self::getPageVisit($date);
  60. if (empty($data)) {
  61. return [];
  62. }
  63. foreach ($data as &$v) {
  64. $v['create_time'] = time();
  65. $v['update_time'] = time();
  66. $v['start_time'] = strtotime($date); // 开始时间 00:00:00
  67. $v['end_time'] = strtotime($date) + 86400 - 1; // 结束时间 23:59:59
  68. $v['page_path_name'] = self::getPageName($v['page_path']);
  69. $v['ref_date'] = $date;
  70. }
  71. return $data;
  72. }
  73. /**
  74. * 获取用户访问页面数据
  75. * 限定查询1天数据
  76. *
  77. * @param $date
  78. * @return array|mixed
  79. */
  80. private static function getPageVisit($date)
  81. {
  82. $params['begin_date'] = $date;
  83. $params['end_date'] = $date;
  84. $data = MpWxService::doAnalysisAction('getweanalysisappidvisitpage', $params);
  85. $data = $data['list'] ?? [];
  86. return $data;
  87. }
  88. /**
  89. * 根据页面路径获取页面名称
  90. *
  91. * @param string $page 页面路径
  92. * @return string
  93. */
  94. public static function getPageName($page)
  95. {
  96. $pages = [
  97. "pages/index/pages/explore/explore" => "探秘",
  98. "pages/user/pages/appletIncomePoster/appletIncomePoster" => "推荐官分享码(推广商品)",
  99. "pages/cart/pages/myOrder/myOrder" => "我的订单",
  100. "pages/public/pages/about/about" => "关于我们",
  101. "pages/cart/pages/noPayment/noPayment" => "商品未支付",
  102. "pages/user/pages/store/storeDetails/storeDetails" => "门店详情",
  103. "pages/user/pages/promotionCenter/promotionCenter" => "门店管理\推广中心\邀请有礼",
  104. "pages/cart/pages/orderDetail/orderDetail" => "商品订单详情",
  105. "pages/tabBar/shoppingCart/shoppingCart" => "购物车",
  106. "pages/cart/pages/appraise/appraise" => "发布评价",
  107. "pages/user/pages/addressList/addressList" => "收货地址列表",
  108. "pages/user/pages/store/addGroup/addGroup" => "加入团队",
  109. "pages/tabBar/index/index" => "首页",
  110. "pages/user/pages/store/applyRetail/applyRetail" => "邀请有礼(申请成为推荐官)",
  111. "pages/user/pages/addGroup/addGroup" => "加入团队",
  112. "pages/cart/pages/goodsPoster/goodsPoster" => "商品海报",
  113. "pages/user/pages/invitation/invitation" => "邀请店员",
  114. "pages/cart/pages/invoice/invoice" => "申请开票",
  115. "pages/tabBar/user/user" => "我的",
  116. "pages/index/pages/coupon/myCoupon" => "我的优惠券",
  117. "pages/user/pages/appletPoster/appletPoster" => "推广海报(邀请推荐管)",
  118. "pages/user/pages/store/retailExplain/retailExplain" => "推广海报",
  119. "pages/index/pages/rookieVoucher/rookieVoucher" => "领取新人券",
  120. "pages/cart/pages/logisticsDetail/logisticsDetail" => "物流详情",
  121. "pages/index/pages/search/search" => "搜索",
  122. "pages/user/pages/withdrawal/withdrawal" => "提现",
  123. "pages/user/pages/store/promotionCenter/promotionCenter" => "门店管理\推广中心\邀请有礼",
  124. "pages/index/pages/couponCenter/couponCenter" => "领券中心",
  125. "pages/user/pages/staffList/staffList" => "员工业绩榜单",
  126. "pages/index/pages/riceCard/cardDetail/cardDetail" => "米卡详情(现金卡)",
  127. "pages/user/pages/serviceAgreement/serviceAgreement" => "服务协议",
  128. "pages/user/pages/privacy/privacy" => "隐私协议",
  129. "pages/cart/pages/invoiceSuccess/invoiceSuccess" => "开票成功",
  130. "pages/user/pages/myBonus/myBonus" => "我的奖励金",
  131. "pages/user/pages/about/about" => "关于我们",
  132. "pages/user/pages/proceeds/proceeds" => "我的收益金",
  133. "pages/cart/pages/appraiseSuccess/appraiseSuccess" => "发布评价成功",
  134. "pages/user/pages/pushOrder/pushOrder" => "推广订单",
  135. "pages/index/pages/riceCard/cardNoPay/cardNoPay" => "米卡未支付",
  136. "pages/cart/pages/goodsDetail/goodsDetail" => "商品详情",
  137. "pages/user/pages/store/upgradeRetail/upgradeRetail" => "升级推荐官",
  138. "pages/public/pages/privacy/privacy" => "隐私协议",
  139. "pages/user/pages/address/address" => "新增收货地址",
  140. "pages/public/pages/serviceAgreement/serviceAgreement" => "服务协议",
  141. "pages/index/index" => "首页",
  142. "pages/user/pages/withdrawalList/withdrawalList" => "提现列表",
  143. "pages/tabBar/rice/rice" => "品牌文化",
  144. "pages/user/pages/footprint/footprint" => "我的足迹",
  145. "pages/index/pages/searchResult/searchResult" => "搜索结果",
  146. "pages/cart/pages/confirmOrder/confirmOrder" => "确认订单",
  147. "pages/cart/pages/allAppraiseList/allAppraiseList" => "全部评价",
  148. "pages/user/pages/store/clerkHandover/clerkHandover" => "店员交接",
  149. "pages/user/pages/pushUser/pushUser" => "直推用户\门店顾客",
  150. "pages/user/pages/favorite/favorite" => "我的收藏",
  151. "pages/tabBar/login/login" => "登录",
  152. "pages/user/pages/store/removeShopowner/removeShopowner" => "解聘店长",
  153. "pages/index/pages/bossInviteCode/bossInviteCode" => "生成邀请海报(老板专用)",
  154. "pages/user/pages/moreService/moreService" => "更多服务",
  155. "pages/user/pages/selectTime/selectTime" => "推广订单-选择时间",
  156. "pages/index/pages/riceCard/myRiceCard/myRiceCard" => "我的米卡",
  157. "pages/index/pages/riceCard/cardList/cardList" => "米卡列表",
  158. "pages/cart/pages/refund/refundDetail/refundDetail" => "退款详情",
  159. "pages/cart/pages/refund/refundApply/refundApply" => "申请退款",
  160. "pages/user/pages/appletRetailPoster/appletRetailPoster" => "推荐官海报",
  161. "pages/cart/pages/paySuccess/paySuccess" => "米卡购买成功",
  162. "pages/user/pages/store/selfTakeOrder/selfTakeOrder" => "门店自提",
  163. "pages/cart/pages/invoiceCheck/invoiceCheck" => "核对发票信息",
  164. "pages/user/pages/store/hireShopowner/hireShopowner" => "聘请店长",
  165. "pages/index/pages/riceCard/cardPaySuccess/cardPaySuccess" => "米卡购买成功",
  166. "pages/tabBar/allGoods/allGoods" => "全部商品",
  167. "pages/activity/pages/bargain/index/index" => "砍价活动主页",
  168. "pages/activity/pages/bargain/bargainDetail/bargainDetail" => "砍价活动详情",
  169. "pages/activity/pages/fission/index/index" => "分享得优惠",
  170. "pages/activity/pages/fission/receive/receive" => "好友送福利",
  171. ];
  172. return $pages[$page] ?? '';
  173. }
  174. public static function getList($params)
  175. {
  176. $list = self::getQuery($params)
  177. ->paginate()->each(function($v) {
  178. $v['page_path_name'] = AnalysisPageVisit::getPageName($v['page_path']);
  179. $v['page_staytime_pv'] = number_format((float)$v['page_staytime_pv'], 2);
  180. $v['exitpage_percent'] = $v['exitpage_percent'] > 0 ? $v['exitpage_percent'] : 0;
  181. });
  182. return $list;
  183. }
  184. private static function getQuery($params)
  185. {
  186. $sortField = $params['sortField'] ?? 'page_visit_pv';
  187. $sortOrder = $params['sortOrder'] ?? 'descend';
  188. $sortOrder = str_replace(['ascend','descend'], ['asc','desc'], $sortOrder);
  189. list($start,$end) = self::getStartEndTime($params);
  190. $model = self::where('start_time', '>=', $start)
  191. ->where('end_time', '<', $end+ 86400)
  192. ->order($sortField, $sortOrder)
  193. ->field('page_path,sum(page_visit_pv) as page_visit_pv,sum(page_visit_uv) as page_visit_uv,sum(page_staytime_pv*page_visit_pv)/sum(page_visit_pv) as page_staytime_pv,
  194. sum(entrypage_pv) as entrypage_pv,sum(exitpage_pv) as exitpage_pv,sum(page_share_pv) as page_share_pv,sum(page_share_uv) as page_share_uv,
  195. ROUND(sum(exitpage_pv) / sum(page_visit_pv) * 100,2) as exitpage_percent')
  196. ->group('page_path');
  197. return $model;
  198. }
  199. public static function getStartEndTime($params)
  200. {
  201. $type = $params['type'] ?? 2; // 时间筛选类型 1-最近7天 2-最近30天 3-自定义
  202. $start = (int)($params['start'] ?? '');
  203. $end = (int)($params['end'] ?? '');
  204. if ($type == 3 && (!$start || !$end)) {
  205. // return $this->renderError('自定义区间时间不能为空');
  206. }
  207. // 根据时间筛选类型计算筛选开始结束时间
  208. if ($type == 1) { //最近7天
  209. $start = strtotime('-7 days');
  210. $end = strtotime('-1 days');
  211. } elseif ($type == 2) {//最近30天
  212. $start = strtotime('-30 days');
  213. $end = strtotime('-1 days');
  214. }
  215. $start = strtotime(date('Y-m-d', $start));
  216. $end = strtotime(date('Y-m-d', $end));
  217. return [$start,$end];
  218. }
  219. public static function export(array $params)
  220. {
  221. $data['header'] = ['页面', '访问次数', '访问人数', '次均时长(s)', '入口页次数','退出页次数', '退出率', '分享次数', '分享人数'];
  222. $data['filename'] = '使用分析_页面分析';
  223. $data['data'] = [];
  224. $list = self::getQuery($params)
  225. ->select();
  226. $new_list = [];
  227. foreach ($list as $v){
  228. $new_list['page_path_name'] = AnalysisPageVisit::getPageName($v['page_path']);
  229. $new_list['page_visit_pv'] = $v['page_visit_pv'];
  230. $new_list['page_visit_uv'] = $v['page_visit_uv'];
  231. $new_list['page_staytime_pv'] = number_format((float)$v['page_staytime_pv'], 2);
  232. $new_list['entrypage_pv'] = $v['entrypage_pv'];
  233. $new_list['exitpage_pv'] = $v['exitpage_pv'];
  234. $new_list['exitpage_percent'] = ($v['exitpage_percent'] > 0 ? $v['exitpage_percent'] : 0).'%';
  235. $new_list['page_share_pv'] = $v['page_share_pv'];
  236. $new_list['page_share_uv'] = $v['page_share_uv'];
  237. $data['data'][] = $new_list;
  238. }
  239. return $data;
  240. }
  241. }