statistics_goods.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <?php
  2. /**
  3. * 统计概述
  4. ***/
  5. defined('InShopNC') or exit('Access Invalid!');
  6. class statistics_goodsControl extends BaseSellerControl {
  7. private $search_arr;//处理后的参数
  8. private $gc_arr;//分类数组
  9. private $choose_gcid;//选择的分类ID
  10. public function __construct(){
  11. parent::__construct();
  12. Language::read('member_store_statistics');
  13. import('function.statistics');
  14. import('function.datehelper');
  15. $model = Model('stat');
  16. //存储参数
  17. $this->search_arr = $_REQUEST;
  18. //处理搜索时间
  19. if (in_array($this->search_arr['op'],array('price','hotgoods'))){
  20. $this->search_arr = $model->dealwithSearchTime($this->search_arr);
  21. //获得系统年份
  22. $year_arr = getSystemYearArr();
  23. //获得系统月份
  24. $month_arr = getSystemMonthArr();
  25. //获得本月的周时间段
  26. $week_arr = getMonthWeekArr($this->search_arr['week']['current_year'], $this->search_arr['week']['current_month']);
  27. Tpl::output('year_arr', $year_arr);
  28. Tpl::output('month_arr', $month_arr);
  29. Tpl::output('week_arr', $week_arr);
  30. }
  31. Tpl::output('search_arr', $this->search_arr);
  32. /**
  33. * 处理商品分类
  34. */
  35. $this->choose_gcid = ($t = intval($_REQUEST['choose_gcid']))>0?$t:0;
  36. $gccache_arr = Model('goods_class')->getGoodsclassCache($this->choose_gcid,3);
  37. $this->gc_arr = $gccache_arr['showclass'];
  38. Tpl::output('gc_json',json_encode($gccache_arr['showclass']));
  39. Tpl::output('gc_choose_json',json_encode($gccache_arr['choose_gcid']));
  40. }
  41. /**
  42. * 商品列表
  43. */
  44. public function goodslistOp(){
  45. $model = Model('stat');
  46. //统计的日期0点
  47. $stat_time = strtotime(date('Y-m-d',time())) - 86400;
  48. /*
  49. * 近30天
  50. */
  51. $stime = $stat_time - (86400*29);//30天前
  52. $etime = $stat_time + 86400 - 1;//昨天23:59
  53. //查询订单商品表下单商品数
  54. $where = array();
  55. $where['order_isvalid'] = 1;//计入统计的有效订单
  56. $where['store_id'] = $_SESSION['store_id'];
  57. $where['order_add_time'] = array('between',array($stime,$etime));
  58. if($this->choose_gcid > 0){
  59. $gc_depth = $this->gc_arr[$this->choose_gcid]['depth'];
  60. $where['gc_parentid_'.$gc_depth] = $this->choose_gcid;
  61. }
  62. if(trim($_GET['search_gname'])){
  63. $where['goods_name'] = array('like',"%".trim($_GET['search_gname'])."%");
  64. }
  65. //查询总条数
  66. $count_arr = $model->statByStatordergoods($where, 'count(DISTINCT goods_id) as countnum');
  67. $countnum = intval($count_arr[0]['countnum']);
  68. $field = ' goods_id,goods_name,goods_image,goods_price,SUM(goods_num) as ordergoodsnum,SUM(goods_pay_price) as ordergamount ';
  69. //排序
  70. $orderby_arr = array('ordergoodsnum asc','ordergoodsnum desc','ordergamount asc','ordergamount desc');
  71. if (!in_array(trim($this->search_arr['orderby']),$orderby_arr)){
  72. $this->search_arr['orderby'] = 'ordergoodsnum desc';
  73. }
  74. $orderby = trim($this->search_arr['orderby']).',goods_id';
  75. $stat_ordergoods = $model->statByStatordergoods($where, $field, array(5,$countnum), 0, $this->search_arr['orderby'], 'goods_id');
  76. Tpl::output('goodslist',$stat_ordergoods);
  77. Tpl::output('show_page',$model->showpage(2));
  78. Tpl::output('orderby',$this->search_arr['orderby']);
  79. self::profile_menu('goodslist');
  80. Tpl::showpage('stat.goods.goodslist');
  81. }
  82. /**
  83. * 商品详细
  84. */
  85. public function goodsinfoOp(){
  86. $templatesname = 'stat.goods.goodsinfo';
  87. $goods_id = intval($_GET['gid']);
  88. if ($goods_id <= 0){
  89. Tpl::output('stat_msg','参数错误');
  90. Tpl::showpage($templatesname,'null_layout');
  91. }
  92. //查询商品信息
  93. $goods_info = Model('goods')->getGoodsInfoByID($goods_id, 'goods_name');
  94. if (!$goods_info){
  95. Tpl::output('stat_msg','参数错误');
  96. Tpl::showpage($templatesname,'null_layout');
  97. }
  98. $model = Model('stat');
  99. //统计的日期0点
  100. $stat_time = strtotime(date('Y-m-d',time())) - 86400;
  101. /*
  102. * 近30天
  103. */
  104. $stime = $stat_time - (86400*29);//30天前
  105. $etime = $stat_time + 86400 - 1;//昨天23:59
  106. $stat_arr = array();
  107. for($i=$stime; $i<$etime; $i+=86400){
  108. //当前数据的时间
  109. $timetext = date('n',$i).'-'.date('j',$i);
  110. //统计图数据
  111. $stat_list['ordergoodsnum'][$timetext] = 0;
  112. $stat_list['ordergamount'][$timetext] = 0;
  113. $stat_list['ordernum'][$timetext] = 0;
  114. //横轴
  115. $stat_arr['ordergoodsnum']['xAxis']['categories'][] = $timetext;
  116. $stat_arr['ordergamount']['xAxis']['categories'][] = $timetext;
  117. $stat_arr['ordernum']['xAxis']['categories'][] = $timetext;
  118. }
  119. //查询订单商品表下单商品数
  120. $where = array();
  121. $where['goods_id'] = $goods_id;
  122. $where['order_isvalid'] = 1;//计入统计的有效订单
  123. $where['store_id'] = $_SESSION['store_id'];
  124. $where['order_add_time'] = array('between',array($stime,$etime));
  125. $field = ' goods_id,goods_name,COUNT(DISTINCT order_id) as ordernum,SUM(goods_num) as ordergoodsnum,SUM(goods_pay_price) as ordergamount,MONTH(FROM_UNIXTIME(order_add_time)) as monthval,DAY(FROM_UNIXTIME(order_add_time)) as dayval ';
  126. $stat_ordergoods = $model->statByStatordergoods($where, $field, 0, 0, '','monthval,dayval');
  127. $stat_count = array();
  128. if($stat_ordergoods){
  129. foreach($stat_ordergoods as $k => $v){
  130. $stat_list['ordergoodsnum'][$v['monthval'].'-'.$v['dayval']] = intval($v['ordergoodsnum']);
  131. $stat_list['ordergamount'][$v['monthval'].'-'.$v['dayval']] = floatval($v['ordergamount']);
  132. $stat_list['ordernum'][$v['monthval'].'-'.$v['dayval']] = intval($v['ordernum']);
  133. $stat_count['ordergoodsnum'] = intval($stat_count['ordergoodsnum']) + $v['ordergoodsnum'];
  134. $stat_count['ordergamount'] = floatval($stat_count['ordergamount']) + floatval($v['ordergamount']);
  135. $stat_count['ordernum'] = intval($stat_count['ordernum']) + $v['ordernum'];
  136. }
  137. }
  138. $stat_count['ordergamount'] = ncPriceFormat($stat_count['ordergamount']);
  139. $stat_arr['ordergoodsnum']['legend']['enabled'] = false;
  140. $stat_arr['ordergoodsnum']['series'][0]['name'] = '下单商品数';
  141. $stat_arr['ordergoodsnum']['series'][0]['data'] = array_values($stat_list['ordergoodsnum']);
  142. $stat_arr['ordergoodsnum']['title'] = '最近30天下单商品数走势';
  143. $stat_arr['ordergoodsnum']['yAxis'] = '下单金额';
  144. $stat_json['ordergoodsnum'] = getStatData_LineLabels($stat_arr['ordergoodsnum']);
  145. $stat_arr['ordergamount']['legend']['enabled'] = false;
  146. $stat_arr['ordergamount']['series'][0]['name'] = '下单金额';
  147. $stat_arr['ordergamount']['series'][0]['data'] = array_values($stat_list['ordergamount']);
  148. $stat_arr['ordergamount']['title'] = '最近30天下单金额走势';
  149. $stat_arr['ordergamount']['yAxis'] = '下单金额';
  150. $stat_json['ordergamount'] = getStatData_LineLabels($stat_arr['ordergamount']);
  151. $stat_arr['ordernum']['legend']['enabled'] = false;
  152. $stat_arr['ordernum']['series'][0]['name'] = '下单量';
  153. $stat_arr['ordernum']['series'][0]['data'] = array_values($stat_list['ordernum']);
  154. $stat_arr['ordernum']['title'] = '最近30天下单量走势';
  155. $stat_arr['ordernum']['yAxis'] = '下单金额';
  156. $stat_json['ordernum'] = getStatData_LineLabels($stat_arr['ordernum']);
  157. Tpl::output('stat_json',$stat_json);
  158. Tpl::output('stat_count',$stat_count);
  159. Tpl::output('goods_info',$goods_info);
  160. Tpl::showpage($templatesname,'null_layout');
  161. }
  162. /**
  163. * 价格销量统计
  164. */
  165. public function priceOp(){
  166. if(!$this->search_arr['search_type']){
  167. $this->search_arr['search_type'] = 'day';
  168. }
  169. $model = Model('stat');
  170. //获得搜索的开始时间和结束时间
  171. $searchtime_arr = $model->getStarttimeAndEndtime($this->search_arr);
  172. $where = array();
  173. $where['store_id'] = $_SESSION['store_id'];
  174. $where['order_isvalid'] = 1;//计入统计的有效订单
  175. $where['order_add_time'] = array('between',$searchtime_arr);
  176. //商品分类
  177. if ($this->choose_gcid > 0){
  178. //获得分类深度
  179. $depth = $this->gc_arr[$this->choose_gcid]['depth'];
  180. $where['gc_parentid_'.$depth] = $this->choose_gcid;
  181. }
  182. $field = '1';
  183. $pricerange = Model('store_extend')->getfby_store_id($_SESSION['store_id'],'pricerange');
  184. $pricerange_arr = $pricerange?unserialize($pricerange):array();
  185. if ($pricerange_arr){
  186. $stat_arr['series'][0]['name'] = '下单量';
  187. //设置价格区间最后一项,最后一项只有开始值没有结束值
  188. $pricerange_count = count($pricerange_arr);
  189. if ($pricerange_arr[$pricerange_count-1]['e']){
  190. $pricerange_arr[$pricerange_count]['s'] = $pricerange_arr[$pricerange_count-1]['e'] + 1;
  191. $pricerange_arr[$pricerange_count]['e'] = '';
  192. }
  193. foreach ((array)$pricerange_arr as $k=>$v){
  194. $v['s'] = intval($v['s']);
  195. $v['e'] = intval($v['e']);
  196. //构造查询字段
  197. if ($v['e']){
  198. $field .= " ,SUM(IF(goods_pay_price/goods_num > {$v['s']} and goods_pay_price/goods_num <= {$v['e']},goods_num,0)) as goodsnum_{$k}";
  199. } else {
  200. $field .= " ,SUM(IF(goods_pay_price/goods_num > {$v['s']},goods_num,0)) as goodsnum_{$k}";
  201. }
  202. }
  203. $ordergooods_list = $model->getoneByStatordergoods($where, $field);
  204. if($ordergooods_list){
  205. foreach ((array)$pricerange_arr as $k=>$v){
  206. //横轴
  207. if ($v['e']){
  208. $stat_arr['xAxis']['categories'][] = $v['s'].'-'.$v['e'];
  209. } else {
  210. $stat_arr['xAxis']['categories'][] = $v['s'].'以上';
  211. }
  212. //统计图数据
  213. if ($ordergooods_list['goodsnum_'.$k]){
  214. $stat_arr['series'][0]['data'][] = intval($ordergooods_list['goodsnum_'.$k]);
  215. } else {
  216. $stat_arr['series'][0]['data'][] = 0;
  217. }
  218. }
  219. }
  220. //得到统计图数据
  221. $stat_arr['title'] = '价格销量分布';
  222. $stat_arr['legend']['enabled'] = false;
  223. $stat_arr['yAxis'] = '销量';
  224. $pricerange_statjson = getStatData_LineLabels($stat_arr);
  225. } else {
  226. $pricerange_statjson = '';
  227. }
  228. Tpl::output('statjson',$pricerange_statjson);
  229. self::profile_menu('price');
  230. Tpl::showpage('stat.goods.price');
  231. }
  232. /**
  233. * 热卖商品
  234. */
  235. public function hotgoodsOp(){
  236. $topnum = 30;
  237. if(!$this->search_arr['search_type']){
  238. $this->search_arr['search_type'] = 'day';
  239. }
  240. $model = Model('stat');
  241. //获得搜索的开始时间和结束时间
  242. $searchtime_arr = $model->getStarttimeAndEndtime($this->search_arr);
  243. $model = Model('stat');
  244. $where = array();
  245. $where['store_id'] = $_SESSION['store_id'];
  246. $where['order_isvalid'] = 1;//计入统计的有效订单
  247. $where['order_add_time'] = array('between',$searchtime_arr);
  248. //查询销量top
  249. //构造横轴数据
  250. for($i=1; $i<=$topnum; $i++){
  251. //数据
  252. $stat_arr['series'][0]['data'][] = array('name'=>'','y'=>0);
  253. //横轴
  254. $stat_arr['xAxis']['categories'][] = "$i";
  255. }
  256. $field = ' goods_id,goods_name,SUM(goods_num) as goodsnum ';
  257. $orderby = 'goodsnum desc,goods_id';
  258. $statlist = array();
  259. $statlist['goodsnum'] = $model->statByStatordergoods($where, $field, 0, $topnum, $orderby, 'goods_id');
  260. foreach ((array)$statlist['goodsnum'] as $k=>$v){
  261. $stat_arr['series'][0]['data'][$k] = array('name'=>strval($v['goods_name']),'y'=>intval($v['goodsnum']));
  262. }
  263. $stat_arr['series'][0]['name'] = '下单商品数';
  264. $stat_arr['legend']['enabled'] = false;
  265. //得到统计图数据
  266. $stat_arr['title'] = '热卖商品TOP'.$topnum;
  267. $stat_arr['yAxis'] = '下单商品数';
  268. $stat_json['goodsnum'] = getStatData_Column2D($stat_arr);
  269. unset($stat_arr);
  270. //查询下单金额top
  271. //构造横轴数据
  272. for($i=1; $i<=$topnum; $i++){
  273. //数据
  274. $stat_arr['series'][0]['data'][] = array('name'=>'','y'=>0);
  275. //横轴
  276. $stat_arr['xAxis']['categories'][] = "$i";
  277. }
  278. $field = ' goods_id,goods_name,SUM(goods_pay_price) as orderamount ';
  279. $orderby = 'orderamount desc,goods_id';
  280. $statlist['orderamount'] = $model->statByStatordergoods($where, $field, 0, $topnum, $orderby, 'goods_id');
  281. foreach ((array)$statlist['orderamount'] as $k=>$v){
  282. $stat_arr['series'][0]['data'][$k] = array('name'=>strval($v['goods_name']),'y'=>floatval($v['orderamount']));
  283. }
  284. $stat_arr['series'][0]['name'] = '下单金额';
  285. $stat_arr['legend']['enabled'] = false;
  286. //得到统计图数据
  287. $stat_arr['title'] = '热卖商品TOP'.$topnum;
  288. $stat_arr['yAxis'] = '下单金额';
  289. $stat_json['orderamount'] = getStatData_Column2D($stat_arr);
  290. Tpl::output('stat_json',$stat_json);
  291. Tpl::output('statlist',$statlist);
  292. self::profile_menu('hotgoods');
  293. Tpl::showpage('stat.goods.hotgoods');
  294. }
  295. /**
  296. * 用户中心右边,小导航
  297. *
  298. * @param string $menu_type 导航类型
  299. * @param string $menu_key 当前导航的menu_key
  300. * @return
  301. */
  302. private function profile_menu($menu_key='') {
  303. $menu_array = array(
  304. 1=>array('menu_key'=>'goodslist','menu_name'=>'商品详情', 'menu_url'=>'index.php?act=statistics_goods&op=goodslist'),
  305. 2=>array('menu_key'=>'price','menu_name'=>'价格销量', 'menu_url'=>'index.php?act=statistics_goods&op=price'),
  306. 3=>array('menu_key'=>'hotgoods','menu_name'=>'热卖商品', 'menu_url'=>'index.php?act=statistics_goods&op=hotgoods'),
  307. );
  308. Tpl::output('member_menu',$menu_array);
  309. Tpl::output('menu_key',$menu_key);
  310. }
  311. }