stat_marketing.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <?php
  2. /**
  3. * 营销分析
  4. ***/
  5. defined('InShopNC') or exit('Access Invalid!');
  6. class stat_marketingControl extends SystemControl{
  7. private $links = array(
  8. array('url'=>'act=stat_marketing&op=promotion','lang'=>'stat_promotion'),
  9. array('url'=>'act=stat_marketing&op=group','lang'=>'stat_group'),
  10. );
  11. private $search_arr;//处理后的参数
  12. public function __construct(){
  13. parent::__construct();
  14. Language::read('stat');
  15. import('function.statistics');
  16. import('function.datehelper');
  17. $model = Model('stat');
  18. //存储参数
  19. $this->search_arr = $_REQUEST;
  20. //处理搜索时间
  21. if (in_array($this->search_arr['op'],array('promotion','group'))){
  22. $this->search_arr = $model->dealwithSearchTime($this->search_arr);
  23. //获得系统年份
  24. $year_arr = getSystemYearArr();
  25. //获得系统月份
  26. $month_arr = getSystemMonthArr();
  27. //获得本月的周时间段
  28. $week_arr = getMonthWeekArr($this->search_arr['week']['current_year'], $this->search_arr['week']['current_month']);
  29. Tpl::output('year_arr', $year_arr);
  30. Tpl::output('month_arr', $month_arr);
  31. Tpl::output('week_arr', $week_arr);
  32. }
  33. Tpl::output('search_arr', $this->search_arr);
  34. }
  35. /**
  36. * 促销分析
  37. */
  38. public function promotionOp(){
  39. if(!$this->search_arr['search_type']){
  40. $this->search_arr['search_type'] = 'day';
  41. }
  42. $model = Model('stat');
  43. //获得搜索的开始时间和结束时间
  44. $searchtime_arr = $model->getStarttimeAndEndtime($this->search_arr);
  45. $where = array();
  46. $where['order_isvalid'] = 1;//计入统计的有效订单
  47. $where['order_add_time'] = array('between',$searchtime_arr);
  48. $where['goods_type'] = array('in',array(2,3,4));
  49. //下单量
  50. $field = ' goods_type,count(DISTINCT order_id) as ordernum,SUM(goods_num) as goodsnum,SUM(goods_pay_price) as orderamount';
  51. $statlist_tmp = $model->statByStatordergoods($where, $field, 0, 0, 'goods_type', 'goods_type');
  52. //优惠类型数组
  53. $goodstype_arr = array(2=>'抢购',3=>'限时折扣',4=>'优惠套装');
  54. $statlist = array();
  55. $statcount = array('ordernum'=>0,'goodsnum'=>0,'orderamount'=>0.00);
  56. $stat_arr = array();
  57. $stat_json = array('ordernum'=>'','goodsnum'=>'','orderamount'=>'');
  58. if ($statlist_tmp){
  59. foreach((array)$statlist_tmp as $k=>$v){
  60. $statcount['ordernum'] += intval($v['ordernum']);
  61. $statcount['goodsnum'] += intval($v['goodsnum']);
  62. $statcount['orderamount'] += floatval($v['orderamount']);
  63. }
  64. foreach((array)$statlist_tmp as $k=>$v){
  65. $v['ordernumratio'] = round($v['ordernum']/$statcount['ordernum'],4)*100;
  66. $v['goodsnumratio'] = round($v['goodsnum']/$statcount['goodsnum'],4)*100;
  67. $v['orderamountratio'] = round($v['orderamount']/$statcount['orderamount'],4)*100;
  68. $statlist_tmp2[$v['goods_type']] = $v;
  69. $stat_arr['ordernum'][] = array('p_name'=>$goodstype_arr[$v['goods_type']],'allnum'=>$v['ordernumratio']);
  70. $stat_arr['goodsnum'][] = array('p_name'=>$goodstype_arr[$v['goods_type']],'allnum'=>$v['goodsnumratio']);
  71. $stat_arr['orderamount'][] = array('p_name'=>$goodstype_arr[$v['goods_type']],'allnum'=>$v['orderamountratio']);
  72. }
  73. foreach ($goodstype_arr as $k=>$v){
  74. if ($statlist_tmp2[$k]){
  75. $statlist_tmp2[$k]['goodstype_text'] = $v;
  76. $statlist[] = $statlist_tmp2[$k];
  77. } else {
  78. $statlist[] = array('goodstype_text'=>$k,'goodstype_text'=>$v,'ordernum'=>0,'goodsnum'=>0,'orderamount'=>0.00);
  79. }
  80. }
  81. $stat_json['ordernum'] = getStatData_Pie(array('title'=>'下单量','name'=>'下单量(%)','label_show'=>false,'series'=>$stat_arr['ordernum']));
  82. $stat_json['goodsnum'] = getStatData_Pie(array('title'=>'下单商品数','name'=>'下商品数(%)','label_show'=>false,'series'=>$stat_arr['goodsnum']));
  83. $stat_json['orderamount'] = getStatData_Pie(array('title'=>'下单金额','name'=>'下单金额(%)','label_show'=>false,'series'=>$stat_arr['orderamount']));
  84. }
  85. Tpl::output('statcount',$statcount);
  86. Tpl::output('statlist',$statlist);
  87. Tpl::output('stat_json',$stat_json);
  88. Tpl::output('searchtime',implode('|',$searchtime_arr));
  89. Tpl::output('top_link',$this->sublink($this->links, 'promotion'));
  90. Tpl::showpage('stat.marketing.promotion');
  91. }
  92. /**
  93. * 促销销售趋势分析
  94. */
  95. public function promotiontrendOp(){
  96. //优惠类型数组
  97. $goodstype_arr = array(2=>'抢购',3=>'限时折扣',4=>'优惠套装');
  98. $model = Model('stat');
  99. $where = array();
  100. $searchtime_arr_tmp = explode('|',$this->search_arr['t']);
  101. foreach ((array)$searchtime_arr_tmp as $k=>$v){
  102. $searchtime_arr[] = intval($v);
  103. }
  104. $where['order_isvalid'] = 1;//计入统计的有效订单
  105. $where['order_add_time'] = array('between',$searchtime_arr);
  106. $where['goods_type'] = array('in',array(2,3,4));
  107. $field = ' goods_type';
  108. switch ($this->search_arr['stattype']){
  109. case 'orderamount':
  110. $field .= " ,SUM(goods_pay_price) as orderamount";
  111. $caption = '下单金额';
  112. break;
  113. case 'goodsnum':
  114. $field .= " ,SUM(goods_num) as goodsnum";
  115. $caption = '下单商品数';
  116. break;
  117. default:
  118. $field .= " ,count(DISTINCT order_id) as ordernum";
  119. $caption = '下单量';
  120. break;
  121. }
  122. if($this->search_arr['search_type'] == 'day'){
  123. //构造横轴数据
  124. for($i=0; $i<24; $i++){
  125. //横轴
  126. $stat_arr['xAxis']['categories'][] = "$i";
  127. foreach ($goodstype_arr as $k=>$v){
  128. $statlist[$k][$i] = 0;
  129. }
  130. }
  131. $field .= ' ,HOUR(FROM_UNIXTIME(order_add_time)) as timeval ';
  132. }
  133. if($this->search_arr['search_type'] == 'week'){
  134. //构造横轴数据
  135. for($i=1; $i<=7; $i++){
  136. $tmp_weekarr = getSystemWeekArr();
  137. //横轴
  138. $stat_arr['xAxis']['categories'][] = $tmp_weekarr[$i];
  139. unset($tmp_weekarr);
  140. foreach ($goodstype_arr as $k=>$v){
  141. $statlist[$k][$i] = 0;
  142. }
  143. }
  144. $field .= ' ,WEEKDAY(FROM_UNIXTIME(order_add_time))+1 as timeval ';
  145. }
  146. if($this->search_arr['search_type'] == 'month'){
  147. //计算横轴的最大量(由于每个月的天数不同)
  148. $dayofmonth = date('t',$searchtime_arr[0]);
  149. //构造横轴数据
  150. for($i=1; $i<=$dayofmonth; $i++){
  151. //横轴
  152. $stat_arr['xAxis']['categories'][] = $i;
  153. foreach ($goodstype_arr as $k=>$v){
  154. $statlist[$k][$i] = 0;
  155. }
  156. }
  157. $field .= ' ,day(FROM_UNIXTIME(order_add_time)) as timeval ';
  158. }
  159. //查询数据
  160. $statlist_tmp = $model->statByStatordergoods($where, $field, 0, 0, 'timeval','goods_type,timeval');
  161. //整理统计数组
  162. if($statlist_tmp){
  163. foreach($statlist_tmp as $k => $v){
  164. //将数据按照不同的促销方式分组
  165. foreach ($goodstype_arr as $t_k=>$t_v){
  166. if ($t_k == $v['goods_type']){
  167. switch ($this->search_arr['stattype']){
  168. case 'orderamount':
  169. $statlist[$t_k][$v['timeval']] = round($v[$this->search_arr['stattype']],2);
  170. break;
  171. case 'goodsnum':
  172. $statlist[$t_k][$v['timeval']] = intval($v[$this->search_arr['stattype']]);
  173. break;
  174. default:
  175. $statlist[$t_k][$v['timeval']] = intval($v[$this->search_arr['stattype']]);
  176. break;
  177. }
  178. }
  179. }
  180. }
  181. }
  182. foreach ($goodstype_arr as $k=>$v){
  183. $tmp = array();
  184. $tmp['name'] = $v;
  185. $tmp['data'] = array_values($statlist[$k]);
  186. $stat_arr['series'][] = $tmp;
  187. }
  188. //得到统计图数据
  189. $stat_arr['title'] = $caption.'统计';
  190. $stat_arr['yAxis'] = $caption;
  191. $stat_json = getStatData_LineLabels($stat_arr);
  192. Tpl::output('stat_json',$stat_json);
  193. Tpl::output('stattype',$_GET['stattype']);
  194. Tpl::showpage('stat.linelabels','null_layout');
  195. }
  196. /**
  197. * 抢购统计
  198. */
  199. public function groupOp(){
  200. if(!$this->search_arr['search_type']){
  201. $this->search_arr['search_type'] = 'day';
  202. }
  203. $model = Model('stat');
  204. //获得搜索的开始时间和结束时间
  205. $searchtime_arr = $model->getStarttimeAndEndtime($this->search_arr);
  206. Tpl::output('searchtime',implode('|',$searchtime_arr));
  207. Tpl::output('top_link',$this->sublink($this->links, 'group'));
  208. Tpl::showpage('stat.marketing.group');
  209. }
  210. /**
  211. * 抢购统计
  212. */
  213. public function grouplistOp(){
  214. $model = Model('groupbuy');
  215. $where = array();
  216. $where['is_vr'] = 0;//不统计虚拟抢购
  217. $searchtime_arr_tmp = explode('|',$this->search_arr['t']);
  218. foreach ((array)$searchtime_arr_tmp as $k=>$v){
  219. $searchtime_arr[] = intval($v);
  220. }
  221. $where['start_time'] = array('exp',"!(end_time < {$searchtime_arr[0]} or start_time > {$searchtime_arr[1]})");
  222. $where['state'] = array('in',array(10,20,30));
  223. $gname = trim($_GET['gname']);
  224. if ($gname){
  225. $where['groupbuy_name'] = array('like',"%{$gname}%");
  226. }
  227. $grouplist_tmp = $model->getGroupbuyExtendList($where,10,'start_time asc');
  228. if ($grouplist_tmp){
  229. foreach ((array)$grouplist_tmp as $k=>$v){
  230. $v['goodsnum'] = 0;
  231. $v['ordernum'] = 0;
  232. $v['orderrate'] = round(0,2);
  233. $v['goodsamount'] = ncPriceFormat(0);
  234. $grouplist[$v['groupbuy_id']] = $v;
  235. }
  236. //查询抢购的订单
  237. $where = array();
  238. $where['order_isvalid'] = 1;//计入统计的有效订单
  239. $where['goods_type'] = 2;//抢购
  240. $where['promotions_id'] = array('in',array_keys($grouplist));
  241. $field = 'promotions_id,SUM(goods_num) as goodsnum,COUNT(DISTINCT order_id) as ordernum,SUM(goods_pay_price) as goodsamount';
  242. $order_list = Model('stat')->statByStatordergoods($where, $field, 0, 0, '', 'promotions_id');
  243. foreach ((array)$order_list as $k=>$v){
  244. $grouplist[$v['promotions_id']]['goodsnum'] = $v['goodsnum'];
  245. $grouplist[$v['promotions_id']]['ordernum'] = $v['ordernum'];
  246. if (intval($grouplist['views']) > 0){
  247. $grouplist[$v['promotions_id']]['orderrate'] = round(($v['ordernum']/$grouplist[$v['promotions_id']]['views'])*100,2);
  248. }
  249. $grouplist[$v['promotions_id']]['goodsamount'] = $v['goodsamount'];
  250. }
  251. }
  252. Tpl::output('grouplist',$grouplist);
  253. Tpl::output('show_page',$model->showpage(2));
  254. Tpl::output('searchtime',$_GET['t']);
  255. Tpl::showpage('stat.marketing.grouplist','null_layout');
  256. }
  257. /**
  258. * 抢购商品统计
  259. */
  260. public function groupgoodsOp(){
  261. $model = Model('stat');
  262. $where = array();
  263. $searchtime_arr_tmp = explode('|',$this->search_arr['t']);
  264. foreach ((array)$searchtime_arr_tmp as $k=>$v){
  265. $searchtime_arr[] = intval($v);
  266. }
  267. $where['order_add_time'] = array('between',$searchtime_arr);
  268. $where['goods_type'] = 2;//抢购
  269. $field = " goods_id,goods_name";
  270. $field .= " ,SUM(goods_num) as goodsnum";
  271. $field .= " ,SUM(goods_pay_price) as goodsamount";
  272. $field .= " ,SUM(IF(order_state='".ORDER_STATE_CANCEL."',goods_num,0)) as cancelgoodsnum";
  273. $field .= " ,SUM(IF(order_state='".ORDER_STATE_CANCEL."',goods_pay_price,0)) as cancelgoodsamount";
  274. $field .= " ,SUM(IF(order_state<>'".ORDER_STATE_CANCEL."' and order_state<>'".ORDER_STATE_NEW."',goods_num,0)) as finishgoodsnum";
  275. $field .= " ,SUM(IF(order_state<>'".ORDER_STATE_CANCEL."' and order_state<>'".ORDER_STATE_NEW."',goods_pay_price,0)) as finishgoodsamount";
  276. $orderby_arr = array('goodsnum asc','goodsnum desc','goodsamount asc','goodsamount desc','cancelgoodsnum asc','cancelgoodsnum desc','cancelgoodsamount asc','cancelgoodsamount desc','finishgoodsnum asc','finishgoodsnum desc','finishgoodsamount asc','finishgoodsamount desc');
  277. if (!in_array(trim($this->search_arr['orderby']),$orderby_arr)){
  278. $this->search_arr['orderby'] = 'goodsnum desc';
  279. }
  280. $orderby = trim($this->search_arr['orderby']).',goods_id desc';
  281. //统计记录总条数
  282. $count_arr = $model->getoneByStatordergoods($where, 'count(DISTINCT goods_id) as countnum');
  283. $countnum = intval($count_arr['countnum']);
  284. if ($this->search_arr['exporttype'] == 'excel'){
  285. $statlist_tmp = $model->statByStatordergoods($where, $field, 0, 0, $orderby, 'goods_id');
  286. } else {
  287. $statlist_tmp = $model->statByStatordergoods($where, $field, array(10,$countnum), 0, $orderby, 'goods_id');
  288. }
  289. $statheader = array();
  290. $statheader[] = array('text'=>'商品名称','key'=>'goods_name','class'=>'alignleft');
  291. $statheader[] = array('text'=>'下单商品数','key'=>'goodsnum','isorder'=>1);
  292. $statheader[] = array('text'=>'下单金额','key'=>'goodsamount','isorder'=>1);
  293. $statheader[] = array('text'=>'取消商品数','key'=>'cancelgoodsnum','isorder'=>1);
  294. $statheader[] = array('text'=>'取消金额','key'=>'cancelgoodsamount','isorder'=>1);
  295. $statheader[] = array('text'=>'完成商品数','key'=>'finishgoodsnum','isorder'=>1);
  296. $statheader[] = array('text'=>'完成金额','key'=>'finishgoodsamount','isorder'=>1);
  297. foreach ((array)$statlist_tmp as $k=>$v){
  298. $tmp = $v;
  299. foreach ($statheader as $h_k=>$h_v){
  300. $tmp[$h_v['key']] = $v[$h_v['key']];
  301. if ($h_v['key'] == 'goods_name'){
  302. $tmp[$h_v['key']] = '<a href="'.urlShop('goods', 'index', array('goods_id' => $v['goods_id'])).'" target="_blank">'.$v['goods_name'].'</a>';
  303. }
  304. }
  305. $statlist[] = $tmp;
  306. }
  307. if ($this->search_arr['exporttype'] == 'excel'){
  308. //导出Excel
  309. import('libraries.excel');
  310. $excel_obj = new Excel();
  311. $excel_data = array();
  312. //设置样式
  313. $excel_obj->setStyle(array('id'=>'s_title','Font'=>array('FontName'=>'宋体','Size'=>'12','Bold'=>'1')));
  314. //header
  315. foreach ($statheader as $k=>$v){
  316. $excel_data[0][] = array('styleid'=>'s_title','data'=>$v['text']);
  317. }
  318. //data
  319. foreach ((array)$statlist as $k=>$v){
  320. foreach ($statheader as $h_k=>$h_v){
  321. $excel_data[$k+1][] = array('data'=>$v[$h_v['key']]);
  322. }
  323. }
  324. $excel_data = $excel_obj->charset($excel_data,CHARSET);
  325. $excel_obj->addArray($excel_data);
  326. $excel_obj->addWorksheet($excel_obj->charset('抢购商品统计',CHARSET));
  327. $excel_obj->generateXML($excel_obj->charset('抢购商品统计',CHARSET).date('Y-m-d-H',time()));
  328. exit();
  329. } else {
  330. Tpl::output('statheader',$statheader);
  331. Tpl::output('statlist',$statlist);
  332. Tpl::output('show_page',$model->showpage(2));
  333. Tpl::output('searchtime',$_GET['t']);
  334. Tpl::output('orderby',$this->search_arr['orderby']);
  335. Tpl::output('actionurl',"index.php?act={$this->search_arr['act']}&op={$this->search_arr['op']}&t={$this->search_arr['t']}");
  336. Tpl::showpage('stat.listandorder','null_layout');
  337. }
  338. }
  339. }