Stat.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\shop\controller;
  11. use app\model\stat\GoodsStat;
  12. use app\model\system\Stat as StatModel;
  13. use Carbon\Carbon;
  14. /**
  15. * 数据统计
  16. * Class Stat
  17. * @package app\shop\controller
  18. */
  19. class Stat extends BaseShop
  20. {
  21. /**
  22. * 店铺统计
  23. * @return mixed
  24. */
  25. public function shop()
  26. {
  27. $this->assign('today', Carbon::today()->toDateString());
  28. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  29. return $this->fetch("stat/shop");
  30. }
  31. /**
  32. * 获取时间段内统计数据总和
  33. */
  34. public function getStatTotal()
  35. {
  36. if (request()->isAjax()) {
  37. $start_time = input('start_time', strtotime(date('Y-m-d', time())));
  38. $end_time = input('end_time', time());
  39. if ($start_time > $end_time) {
  40. $start_time = input('end_time');
  41. $end_time = input('start_time');
  42. }
  43. $stat_model = new StatModel();
  44. $data = $stat_model->getShopStatSum($this->site_id, $start_time, $end_time);
  45. return $data;
  46. }
  47. }
  48. /**
  49. * 获取天统计趋势数据
  50. */
  51. public function getStatData()
  52. {
  53. if (request()->isAjax()) {
  54. $start_time = input('start_time', strtotime(date('Y-m-d', strtotime('-6 day'))));
  55. $end_time = input('end_time', time());
  56. if ($start_time > $end_time) {
  57. $start_time = input('end_time');
  58. $end_time = input('start_time');
  59. }
  60. $stat_model = new StatModel();
  61. $fields = $stat_model->getStatField();
  62. $fields[] = 'cashier_order_pay_money';
  63. $stat_list = $stat_model->getShopStatList($this->site_id, $start_time, $end_time)[ 'data' ];
  64. $stat_list = array_map(function($item) {
  65. $item[ 'day_time' ] = date('Y-m-d', $item[ 'day_time' ]);
  66. return $item;
  67. }, $stat_list);
  68. $stat_list = array_column($stat_list, null, 'day_time');
  69. $day = ceil(( $end_time - $start_time ) / 86400);
  70. foreach ($fields as $field) {
  71. $value = [];
  72. $time = [];
  73. for ($i = 0; $i < $day; $i++) {
  74. $date = date('Y-m-d', $start_time + $i * 86400);
  75. $time[] = $date;
  76. $value[] = isset($stat_list[ $date ]) && isset($stat_list[ $date ][ $field ]) ? $stat_list[ $date ][ $field ] : 0;
  77. }
  78. $data[ $field ] = $value;
  79. $data[ 'time' ] = $time;
  80. }
  81. return $data;
  82. }
  83. }
  84. /**
  85. * 获取小时统计趋势数据
  86. */
  87. public function getStatHourData()
  88. {
  89. if (request()->isAjax()) {
  90. $time = input('start_time', time());
  91. $carbon = Carbon::createFromTimestamp($time);
  92. $stat_model = new StatModel();
  93. $fields = $stat_model->getStatHourField();
  94. $fields[] = 'cashier_order_pay_money';
  95. $stat_list = $stat_model->getShopStatHourList($this->site_id, $carbon->year, $carbon->month, $carbon->day)[ 'data' ];
  96. $data = [];
  97. $empty = array_map(function() { return 0; }, range(0, 23, 1));
  98. if (!empty($stat_list)) {
  99. $stat_list = array_column($stat_list, null, 'hour');
  100. foreach ($fields as $field) {
  101. $value = [];
  102. for ($i = 0; $i < 24; $i++) {
  103. $value[ $i ] = isset($stat_list[ $i ]) && isset($stat_list[ $i ][ $field ]) ? $stat_list[ $i ][ $field ] : 0;
  104. }
  105. $data[ $field ] = $value;
  106. }
  107. } else {
  108. foreach ($fields as $field) {
  109. $data[ $field ] = $empty;
  110. }
  111. }
  112. $data[ 'time' ] = array_map(function($value) { return $value . '时'; }, range(0, 23, 1));
  113. return $data;
  114. }
  115. }
  116. /**
  117. * 商品统计
  118. * @return mixed
  119. */
  120. public function goods()
  121. {
  122. $this->assign('today', Carbon::today()->toDateString());
  123. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  124. return $this->fetch("stat/goods");
  125. }
  126. /**
  127. * 交易统计
  128. * @return mixed
  129. */
  130. public function order()
  131. {
  132. $this->assign('today', Carbon::today()->toDateString());
  133. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  134. return $this->fetch("stat/order");
  135. }
  136. /**
  137. * 访问统计
  138. * @return mixed
  139. */
  140. public function visit()
  141. {
  142. $this->assign('today', Carbon::today()->toDateString());
  143. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  144. $stat_shop_model = new \app\model\system\Stat();
  145. $today = Carbon::now();
  146. $yesterday = Carbon::yesterday();
  147. $stat_today = $stat_shop_model->getStatShop($this->site_id, $today->year, $today->month, $today->day)[ 'data' ];
  148. $stat_yesterday = $stat_shop_model->getStatShop($this->site_id, $yesterday->year, $yesterday->month, $yesterday->day)[ 'data' ];
  149. $stat_today[ 'conversion_ratio' ] = $stat_today[ 'visit_count' ] > 0 ? round($stat_today[ 'order_member_count' ] / $stat_today[ 'visit_count' ], 2) : 0;
  150. $stat_yesterday[ 'conversion_ratio' ] = $stat_yesterday[ 'visit_count' ] > 0 ? round($stat_yesterday[ 'order_member_count' ] / $stat_yesterday[ 'visit_count' ], 2) : 0;
  151. $this->assign('stat_today', $stat_today);
  152. $this->assign('stat_yesterday', $stat_yesterday);
  153. $day_rate = [];
  154. $day_rate[ 'order_member_count' ] = diff_rate($stat_today[ 'order_member_count' ], $stat_yesterday[ 'order_member_count' ]);
  155. $day_rate[ 'visit_count' ] = diff_rate($stat_today[ 'visit_count' ], $stat_yesterday[ 'visit_count' ]);
  156. $day_rate[ 'member_count' ] = diff_rate($stat_today[ 'member_count' ], $stat_yesterday[ 'member_count' ]);
  157. $day_rate[ 'conversion_ratio' ] = diff_rate($stat_today[ 'conversion_ratio' ], $stat_yesterday[ 'conversion_ratio' ]);
  158. $this->assign('day_rate', $day_rate);
  159. return $this->fetch("stat/visit");
  160. }
  161. /**
  162. * 会员统计
  163. * @return mixed
  164. */
  165. public function member()
  166. {
  167. $this->assign('today', Carbon::today()->toDateString());
  168. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  169. return $this->fetch("stat/member");
  170. }
  171. /**
  172. * 商品排行榜 销量
  173. * */
  174. public function countGoodsSale()
  175. {
  176. if (request()->isAjax()) {
  177. $start_time = input('start_time', '');
  178. $end_time = input('end_time', '');
  179. $page_index = input('page', 1);
  180. $page_size = input('page_size', PAGE_LIST_ROWS);
  181. $stat_model = new StatModel();
  182. $res = $stat_model->getGoodsSaleNumRankingList($this->site_id, $start_time, $end_time, $page_index, $page_size);
  183. return $res;
  184. }
  185. }
  186. /**
  187. * 商品排行榜 销售额
  188. * */
  189. public function countGoodsSaleMoney()
  190. {
  191. if (request()->isAjax()) {
  192. $start_time = input('start_time', '');
  193. $end_time = input('end_time', '');
  194. $page_index = input('page', 1);
  195. $page_size = input('page_size', PAGE_LIST_ROWS);
  196. $stat_model = new StatModel();
  197. $res = $stat_model->getGoodsSaleMoneyRankingList($this->site_id, $start_time, $end_time, $page_index, $page_size);
  198. return $res;
  199. }
  200. }
  201. /**
  202. * 销售额排行
  203. * @return array
  204. */
  205. public function getGoodsOrderMoneyStat(){
  206. $goods_stat_model = new GoodsStat();
  207. $params = array(
  208. 'site_id' => $this->site_id,
  209. 'start_time' => input('start_time', 0),
  210. 'end_time'=> input('end_time', 0),
  211. 'limit' => input('limit', 5)
  212. );
  213. $result = $goods_stat_model->getGoodsOrderMoneyStat($params);
  214. return $result;
  215. }
  216. /**
  217. * 销售量排行
  218. * @return array
  219. */
  220. public function getGoodsOrderNumStat(){
  221. $goods_stat_model = new GoodsStat();
  222. $params = array(
  223. 'site_id' => $this->site_id,
  224. 'start_time' => input('start_time', 0),
  225. 'end_time'=> input('end_time', 0),
  226. 'limit' => input('limit', 5)
  227. );
  228. $result = $goods_stat_model->getGoodsOrderNumStat($params);
  229. return $result;
  230. }
  231. }