GoodsVisitStatistics.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. namespace app\store\model;
  3. use app\common\library\helper;
  4. use app\common\model\GoodsVisitStatistics as GoodsVisitStatisticsModel;
  5. /**
  6. * 商品浏览统计模型
  7. * @package app\store\model
  8. */
  9. class GoodsVisitStatistics extends GoodsVisitStatisticsModel
  10. {
  11. /**
  12. * 获取列表
  13. * @param $param
  14. * @return mixed
  15. */
  16. public function getList($param = [])
  17. {
  18. $model = $this->setQueryFilter($param);
  19. // 排序条件
  20. $sort = $this->setQuerySort($param);
  21. return $model->alias('st')
  22. ->field('sum(st.pv) as pv,sum(st.uv) as uv,sum(stay_time) as stay_time,sum(cart_users) as cart_users,sum(fav_users) as fav_users,sum(share_users) as share_users,sum(pay_users) as pay_users,st.goods_id,g.goods_name,g.goods_no,g.create_time,convert((sum(st.pay_users)/sum(st.uv))*100,decimal(10,2)) as ratio')
  23. ->leftJoin('goods g', 'g.goods_id=st.goods_id')
  24. ->group('st.goods_id')
  25. ->order($sort)
  26. ->paginate(15)
  27. ->each(function ($item) {
  28. $item['stay_time'] = $item['uv'] > 0 ? gmdate('I:s', intval($item['stay_time'] / $item['uv'])) : '0:00';
  29. $item['ratio'] = helper::number2($item['ratio']);
  30. });
  31. }
  32. /**
  33. * 检索排序条件
  34. * @param array $param
  35. * @return array|string[]
  36. */
  37. private function setQuerySort(array $param = [])
  38. {
  39. $params = $this->setQueryDefaultValue($param, [
  40. 'sortField' => '', // 排序类型 默认空:按页面UV倒序 页面PV-pv 页面UV-uv 加购人数-cart_users 收藏人数-fav_users 分享人数-share_users 支付人数-pay_users 支付转化率-ratio
  41. 'sortOrder' => 'descend', // 排序方式 (descend-高到低 ascend-低到高)
  42. ]);
  43. // 排序规则
  44. $sort = [];
  45. if (!empty($params['sortField'])) {
  46. $sort = $params['sortOrder'] == 'descend' ? [$params['sortField'] => 'desc'] : [$params['sortField'] => 'asc'];
  47. } else {
  48. $sort = ['uv' => 'desc'];
  49. }
  50. return array_merge($sort, [$this->getPk() => 'desc']);
  51. }
  52. /**
  53. * 检索查询条件
  54. * @param array $param
  55. * @return \think\db\BaseQuery
  56. */
  57. private function setQueryFilter(array $param)
  58. {
  59. // 实例化查询对象
  60. $query = $this->getNewQuery();
  61. // 查询参数
  62. $params = $this->setQueryDefaultValue($param, [
  63. 'ftype' => -1 // -1全部 1按日 2按周 3按月
  64. ]);
  65. $params['ftype']>-1 && $filter[] = ['st.ftype', '=', (int)$params['ftype']];
  66. // 起止时间
  67. if (!empty($params['betweenTime'])) {
  68. $times = between_time($params['betweenTime']);
  69. $filter[] = ["st.start_time", '>=', $times['start_time']];
  70. $filter[] = ["st.end_time", '<=', $times['end_time']];
  71. }
  72. $filter[] = ['g.goods_id', '>', 0];
  73. $query->where($filter);
  74. return $query;
  75. }
  76. /**
  77. * 导出记录
  78. */
  79. public function export(array $param)
  80. {
  81. $data['header'] = ['商品ID', '商品名称','商品编码', '发布时间','页面PV', '页面UV', '平均停留时长','加购人数','收藏人数','分享人数','支付人数','支付转化率'];
  82. $data['filename'] = '商品浏览数据导出';
  83. $data['data'] = [];
  84. $model = $this->setQueryFilter($param);
  85. // 排序条件
  86. $sort = $this->setQuerySort($param);
  87. $list = $model->alias('st')
  88. ->field('sum(st.pv) as pv,sum(st.uv) as uv,sum(stay_time) as stay_time,sum(cart_users) as cart_users,sum(fav_users) as fav_users,sum(share_users) as share_users,sum(pay_users) as pay_users,st.goods_id,g.goods_name,g.goods_no,g.create_time,convert((sum(st.pay_users)/sum(st.uv))*100,decimal(10,2)) as ratio')
  89. ->leftJoin('goods g', 'g.goods_id=st.goods_id')
  90. ->group('st.goods_id')
  91. ->order($sort)
  92. ->select();
  93. foreach ($list as $arr){
  94. $new_list['goods_id'] = $arr['goods_id'];
  95. $new_list['goods_name'] = $arr['goods_name'];
  96. $new_list['goods_no'] = $arr['goods_no'];
  97. $new_list['create_time'] = $arr['create_time'];
  98. $new_list['pv'] = $arr['pv'];
  99. $new_list['uv'] = $arr['uv'];
  100. $new_list['stay_time'] = $arr['uv'] > 0 ? gmdate('I:s', intval($arr['stay_time'] / $arr['uv'])) : '0:00';
  101. $new_list['cart_users'] = $arr['cart_users'];
  102. $new_list['fav_users'] = $arr['fav_users'];
  103. $new_list['share_users'] = $arr['share_users'];
  104. $new_list['pay_users'] = $arr['pay_users'];
  105. $new_list['ratio'] = helper::number2($arr['ratio']);
  106. $data['data'][] = $new_list;
  107. }
  108. return $data;
  109. }
  110. }