Stat.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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. // var_dump($stat_list);die;
  65. $stat_list = array_map(function($item) {
  66. $item[ 'day_time' ] = date('Y-m-d', $item[ 'day_time' ]);
  67. return $item;
  68. }, $stat_list);
  69. $stat_list = array_column($stat_list, null, 'day_time');
  70. $day = ceil(( $end_time - $start_time ) / 86400);
  71. foreach ($fields as $field) {
  72. $value = [];
  73. $time = [];
  74. for ($i = 0; $i < $day; $i++) {
  75. $date = date('Y-m-d', $start_time + $i * 86400);
  76. $time[] = $date;
  77. $value[] = isset($stat_list[ $date ]) && isset($stat_list[ $date ][ $field ]) ? $stat_list[ $date ][ $field ] : 0;
  78. }
  79. $data[ $field ] = $value;
  80. $data[ 'time' ] = $time;
  81. }
  82. return $data;
  83. }
  84. }
  85. /**
  86. * 获取小时统计趋势数据
  87. */
  88. public function getStatHourData()
  89. {
  90. if (request()->isAjax()) {
  91. $time = input('start_time', time());
  92. $carbon = Carbon::createFromTimestamp($time);
  93. $stat_model = new StatModel();
  94. $fields = $stat_model->getStatHourField();
  95. $fields[] = 'cashier_order_pay_money';
  96. $stat_list = $stat_model->getShopStatHourList($this->site_id, $carbon->year, $carbon->month, $carbon->day)[ 'data' ];
  97. $data = [];
  98. $empty = array_map(function() { return 0; }, range(0, 23, 1));
  99. if (!empty($stat_list)) {
  100. $stat_list = array_column($stat_list, null, 'hour');
  101. foreach ($fields as $field) {
  102. $value = [];
  103. for ($i = 0; $i < 24; $i++) {
  104. $value[ $i ] = isset($stat_list[ $i ]) && isset($stat_list[ $i ][ $field ]) ? $stat_list[ $i ][ $field ] : 0;
  105. }
  106. $data[ $field ] = $value;
  107. }
  108. } else {
  109. foreach ($fields as $field) {
  110. $data[ $field ] = $empty;
  111. }
  112. }
  113. $data[ 'time' ] = array_map(function($value) { return $value . '时'; }, range(0, 23, 1));
  114. return $data;
  115. }
  116. }
  117. /**
  118. * 商品统计
  119. * @return mixed
  120. */
  121. public function goods()
  122. {
  123. $this->assign('today', Carbon::today()->toDateString());
  124. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  125. return $this->fetch("stat/goods");
  126. }
  127. /**
  128. * 交易统计
  129. * @return mixed
  130. */
  131. public function order()
  132. {
  133. $this->assign('today', Carbon::today()->toDateString());
  134. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  135. return $this->fetch("stat/order");
  136. }
  137. /**
  138. * 访问统计
  139. * @return mixed
  140. */
  141. public function visit()
  142. {
  143. $this->assign('today', Carbon::today()->toDateString());
  144. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  145. $stat_shop_model = new \app\model\system\Stat();
  146. $today = Carbon::now();
  147. $yesterday = Carbon::yesterday();
  148. $stat_today = $stat_shop_model->getStatShop($this->site_id, $today->year, $today->month, $today->day)[ 'data' ];
  149. $stat_yesterday = $stat_shop_model->getStatShop($this->site_id, $yesterday->year, $yesterday->month, $yesterday->day)[ 'data' ];
  150. $stat_today[ 'conversion_ratio' ] = $stat_today[ 'visit_count' ] > 0 ? round($stat_today[ 'order_member_count' ] / $stat_today[ 'visit_count' ], 2) : 0;
  151. $stat_yesterday[ 'conversion_ratio' ] = $stat_yesterday[ 'visit_count' ] > 0 ? round($stat_yesterday[ 'order_member_count' ] / $stat_yesterday[ 'visit_count' ], 2) : 0;
  152. $this->assign('stat_today', $stat_today);
  153. $this->assign('stat_yesterday', $stat_yesterday);
  154. $day_rate = [];
  155. $day_rate[ 'order_member_count' ] = diff_rate($stat_today[ 'order_member_count' ], $stat_yesterday[ 'order_member_count' ]);
  156. $day_rate[ 'visit_count' ] = diff_rate($stat_today[ 'visit_count' ], $stat_yesterday[ 'visit_count' ]);
  157. $day_rate[ 'member_count' ] = diff_rate($stat_today[ 'member_count' ], $stat_yesterday[ 'member_count' ]);
  158. $day_rate[ 'conversion_ratio' ] = diff_rate($stat_today[ 'conversion_ratio' ], $stat_yesterday[ 'conversion_ratio' ]);
  159. $this->assign('day_rate', $day_rate);
  160. return $this->fetch("stat/visit");
  161. }
  162. /**
  163. * 会员统计
  164. * @return mixed
  165. */
  166. public function member()
  167. {
  168. $this->assign('today', Carbon::today()->toDateString());
  169. $this->assign('yesterday', Carbon::yesterday()->toDateString());
  170. return $this->fetch("stat/member");
  171. }
  172. /**
  173. * 商品排行榜 销量
  174. * */
  175. public function countGoodsSale()
  176. {
  177. if (request()->isAjax()) {
  178. $start_time = input('start_time', '');
  179. $end_time = input('end_time', '');
  180. $page_index = input('page', 1);
  181. $page_size = input('page_size', PAGE_LIST_ROWS);
  182. $stat_model = new StatModel();
  183. $res = $stat_model->getGoodsSaleNumRankingList($this->site_id, $start_time, $end_time, $page_index, $page_size);
  184. return $res;
  185. }
  186. }
  187. /**
  188. * 商品排行榜 销售额
  189. * */
  190. public function countGoodsSaleMoney()
  191. {
  192. if (request()->isAjax()) {
  193. $start_time = input('start_time', '');
  194. $end_time = input('end_time', '');
  195. $page_index = input('page', 1);
  196. $page_size = input('page_size', PAGE_LIST_ROWS);
  197. $stat_model = new StatModel();
  198. $res = $stat_model->getGoodsSaleMoneyRankingList($this->site_id, $start_time, $end_time, $page_index, $page_size);
  199. return $res;
  200. }
  201. }
  202. /**
  203. * 销售额排行
  204. * @return array
  205. */
  206. public function getGoodsOrderMoneyStat(){
  207. $goods_stat_model = new GoodsStat();
  208. $params = array(
  209. 'site_id' => $this->site_id,
  210. 'start_time' => input('start_time', 0),
  211. 'end_time'=> input('end_time', 0),
  212. 'limit' => input('limit', 5)
  213. );
  214. $result = $goods_stat_model->getGoodsOrderMoneyStat($params);
  215. return $result;
  216. }
  217. /**
  218. * 销售量排行
  219. * @return array
  220. */
  221. public function getGoodsOrderNumStat(){
  222. $goods_stat_model = new GoodsStat();
  223. $params = array(
  224. 'site_id' => $this->site_id,
  225. 'start_time' => input('start_time', 0),
  226. 'end_time'=> input('end_time', 0),
  227. 'limit' => input('limit', 5)
  228. );
  229. $result = $goods_stat_model->getGoodsOrderNumStat($params);
  230. return $result;
  231. }
  232. }