stat_store.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. <?php
  2. /**
  3. * 统计管理(店铺)
  4. ***/
  5. defined('InShopNC') or exit('Access Invalid!');
  6. class stat_storeControl extends SystemControl{
  7. private $links = array(
  8. array('url'=>'act=stat_store&op=newstore','lang'=>'stat_newstore'),
  9. array('url'=>'act=stat_store&op=hotrank','lang'=>'stat_storehotrank'),
  10. array('url'=>'act=stat_store&op=storesales','lang'=>'stat_storesales'),
  11. array('url'=>'act=stat_store&op=degree','lang'=>'stat_storedegree'),
  12. array('url'=>'act=stat_store&op=storearea','lang'=>'stat_storearea'),
  13. );
  14. private $search_arr;//处理后的参数
  15. private $store_class;//店铺分类
  16. public function __construct(){
  17. parent::__construct();
  18. Language::read('stat');
  19. import('function.statistics');
  20. import('function.datehelper');
  21. $model = Model('stat');
  22. //存储参数
  23. $this->search_arr = $_REQUEST;
  24. //处理搜索时间
  25. if (in_array($_REQUEST['op'],array('hotrank','storesales'))){
  26. $this->search_arr = $model->dealwithSearchTime($this->search_arr);
  27. //获得系统年份
  28. $year_arr = getSystemYearArr();
  29. //获得系统月份
  30. $month_arr = getSystemMonthArr();
  31. //获得本月的周时间段
  32. $week_arr = getMonthWeekArr($this->search_arr['week']['current_year'], $this->search_arr['week']['current_month']);
  33. Tpl::output('year_arr', $year_arr);
  34. Tpl::output('month_arr', $month_arr);
  35. Tpl::output('week_arr', $week_arr);
  36. }
  37. Tpl::output('search_arr', $this->search_arr);
  38. //店铺分类
  39. $this->store_class = rkcache('store_class', true);
  40. Tpl::output('store_class', $this->store_class);
  41. }
  42. /**
  43. * 新增店铺
  44. */
  45. public function newstoreOp(){
  46. //导出excel连接地址
  47. $actionurl = 'index.php?act=stat_store&op=newstore';
  48. $where = array();
  49. //所属店铺分类
  50. $search_sclass = intval($_REQUEST['search_sclass']);
  51. if ($search_sclass > 0){
  52. $where['sc_id'] = $search_sclass;
  53. $actionurl .= "&search_sclass=$search_sclass";
  54. }
  55. $field = ' count(*) as allnum ';
  56. if(!$_REQUEST['search_type']){
  57. $_REQUEST['search_type'] = 'day';
  58. }
  59. //初始化时间
  60. //天
  61. if(!$_REQUEST['search_time']){
  62. $_REQUEST['search_time'] = date('Y-m-d', time()-86400);
  63. }
  64. $search_time = strtotime($_REQUEST['search_time']);//搜索的时间
  65. Tpl::output('search_time',$_REQUEST['search_time']);
  66. //周
  67. if(!$_REQUEST['search_time_year']){
  68. $_REQUEST['search_time_year'] = date('Y', time());
  69. }
  70. if(!$_REQUEST['search_time_month']){
  71. $_REQUEST['search_time_month'] = date('m', time());
  72. }
  73. if(!$_REQUEST['search_time_week']){
  74. $_REQUEST['search_time_week'] = implode('|', getWeek_SdateAndEdate(time()));
  75. }
  76. $current_year = $_REQUEST['search_time_year'];
  77. $current_month = $_REQUEST['search_time_month'];
  78. $current_week = $_REQUEST['search_time_week'];
  79. $year_arr = getSystemYearArr();
  80. $month_arr = getSystemMonthArr();
  81. $week_arr = getMonthWeekArr($current_year, $current_month);
  82. Tpl::output('current_year', $current_year);
  83. Tpl::output('current_month', $current_month);
  84. Tpl::output('current_week', $current_week);
  85. Tpl::output('year_arr', $year_arr);
  86. Tpl::output('month_arr', $month_arr);
  87. Tpl::output('week_arr', $week_arr);
  88. $model = Model('stat');
  89. $statlist = array();//统计数据列表
  90. if($_REQUEST['search_type'] == 'day'){
  91. //构造横轴数据
  92. for($i=0; $i<24; $i++){
  93. //统计图数据
  94. $curr_arr[$i] = 0;//今天
  95. $up_arr[$i] = 0;//昨天
  96. //统计表数据
  97. $uplist_arr[$i]['timetext'] = $i;
  98. $currlist_arr[$i]['timetext'] = $i;
  99. //方便搜索会员列表,计算开始时间和结束时间
  100. $currlist_arr[$i]['stime'] = $search_time+$i*3600;
  101. $currlist_arr[$i]['etime'] = $currlist_arr[$i]['stime']+3600;
  102. $uplist_arr[$i]['val'] = 0;
  103. $currlist_arr[$i]['val'] = 0;
  104. //横轴
  105. $stat_arr['xAxis']['categories'][] = "$i";
  106. }
  107. $stime = $search_time - 86400;//昨天0点
  108. $etime = $search_time + 86400 - 1;//今天24点
  109. $today_day = @date('d', $search_time);//今天日期
  110. $yesterday_day = @date('d', $stime);//昨天日期
  111. $where['store_time'] = array('between',array($stime,$etime));
  112. $field .= ' ,DAY(FROM_UNIXTIME(store_time)) as dayval,HOUR(FROM_UNIXTIME(store_time)) as hourval ';
  113. $memberlist = $model->getNewStoreStatList($where, $field, 0, '', 0, 'dayval,hourval');
  114. if($memberlist){
  115. foreach($memberlist as $k => $v){
  116. if($today_day == $v['dayval']){
  117. $curr_arr[$v['hourval']] = intval($v['allnum']);
  118. $currlist_arr[$v['hourval']]['val'] = intval($v['allnum']);
  119. }
  120. if($yesterday_day == $v['dayval']){
  121. $up_arr[$v['hourval']] = intval($v['allnum']);
  122. $uplist_arr[$v['hourval']]['val'] = intval($v['allnum']);
  123. }
  124. }
  125. }
  126. $stat_arr['series'][0]['name'] = '昨天';
  127. $stat_arr['series'][0]['data'] = array_values($up_arr);
  128. $stat_arr['series'][1]['name'] = '今天';
  129. $stat_arr['series'][1]['data'] = array_values($curr_arr);
  130. //统计数据标题
  131. $statlist['headertitle'] = array('小时','昨天','今天','同比');
  132. Tpl::output('actionurl',$actionurl.'&search_type=day&search_time='.date('Y-m-d',$search_time));
  133. }
  134. if($_REQUEST['search_type'] == 'week'){
  135. $current_weekarr = explode('|', $current_week);
  136. $stime = strtotime($current_weekarr[0])-86400*7;
  137. $etime = strtotime($current_weekarr[1])+86400-1;
  138. $up_week = @date('W', $stime);//上周
  139. $curr_week = @date('W', $etime);//本周
  140. //构造横轴数据
  141. for($i=1; $i<=7; $i++){
  142. //统计图数据
  143. $up_arr[$i] = 0;
  144. $curr_arr[$i] = 0;
  145. $tmp_weekarr = getSystemWeekArr();
  146. //统计表数据
  147. $uplist_arr[$i]['timetext'] = $tmp_weekarr[$i];
  148. $currlist_arr[$i]['timetext'] = $tmp_weekarr[$i];
  149. //方便搜索会员列表,计算开始时间和结束时间
  150. $currlist_arr[$i]['stime'] = strtotime($current_weekarr[0])+($i-1)*86400;
  151. $currlist_arr[$i]['etime'] = $currlist_arr[$i]['stime']+86400 - 1;
  152. $uplist_arr[$i]['val'] = 0;
  153. $currlist_arr[$i]['val'] = 0;
  154. //横轴
  155. $stat_arr['xAxis']['categories'][] = $tmp_weekarr[$i];
  156. unset($tmp_weekarr);
  157. }
  158. $where['store_time'] = array('between', array($stime,$etime));
  159. $field .= ',WEEKOFYEAR(FROM_UNIXTIME(store_time)) as weekval,WEEKDAY(FROM_UNIXTIME(store_time))+1 as dayofweekval ';
  160. $memberlist = $model->getNewStoreStatList($where, $field, 0, '', 0, 'weekval,dayofweekval');
  161. if($memberlist){
  162. foreach($memberlist as $k=>$v){
  163. if ($up_week == $v['weekval']){
  164. $up_arr[$v['dayofweekval']] = intval($v['allnum']);
  165. $uplist_arr[$v['dayofweekval']]['val'] = intval($v['allnum']);
  166. }
  167. if ($curr_week == $v['weekval']){
  168. $curr_arr[$v['dayofweekval']] = intval($v['allnum']);
  169. $currlist_arr[$v['dayofweekval']]['val'] = intval($v['allnum']);
  170. }
  171. }
  172. }
  173. $stat_arr['series'][0]['name'] = '上周';
  174. $stat_arr['series'][0]['data'] = array_values($up_arr);
  175. $stat_arr['series'][1]['name'] = '本周';
  176. $stat_arr['series'][1]['data'] = array_values($curr_arr);
  177. //统计数据标题
  178. $statlist['headertitle'] = array('星期','上周','本周','同比');
  179. Tpl::output('actionurl',$actionurl.'&search_type=week&search_time_year='.$current_year.'&search_time_month='.$current_month.'&search_time_week='.$current_week);
  180. }
  181. if($_REQUEST['search_type'] == 'month'){
  182. $stime = strtotime($current_year.'-'.$current_month."-01 -1 month");
  183. $etime = getMonthLastDay($current_year,$current_month)+86400-1;
  184. $up_month = date('m',$stime);
  185. $curr_month = date('m',$etime);
  186. //计算横轴的最大量(由于每个月的天数不同)
  187. $up_dayofmonth = date('t',$stime);
  188. $curr_dayofmonth = date('t',$etime);
  189. $x_max = $up_dayofmonth > $curr_dayofmonth ? $up_dayofmonth : $curr_dayofmonth;
  190. //构造横轴数据
  191. for($i=1; $i<=$x_max; $i++){
  192. //统计图数据
  193. $up_arr[$i] = 0;
  194. $curr_arr[$i] = 0;
  195. //统计表数据
  196. $uplist_arr[$i]['timetext'] = $i;
  197. $currlist_arr[$i]['timetext'] = $i;
  198. //方便搜索会员列表,计算开始时间和结束时间
  199. $currlist_arr[$i]['stime'] = strtotime($current_year.'-'.$current_month."-01")+($i-1)*86400;
  200. $currlist_arr[$i]['etime'] = $currlist_arr[$i]['stime']+86400 - 1;
  201. $uplist_arr[$i]['val'] = 0;
  202. $currlist_arr[$i]['val'] = 0;
  203. //横轴
  204. $stat_arr['xAxis']['categories'][] = $i;
  205. }
  206. $where['store_time'] = array('between', array($stime,$etime));
  207. $field .= ',MONTH(FROM_UNIXTIME(store_time)) as monthval,day(FROM_UNIXTIME(store_time)) as dayval ';
  208. $memberlist = $model->getNewStoreStatList($where, $field, 0, '', 0, 'monthval,dayval');
  209. if($memberlist){
  210. foreach($memberlist as $k=>$v){
  211. if ($up_month == $v['monthval']){
  212. $up_arr[$v['dayval']] = intval($v['allnum']);
  213. $uplist_arr[$v['dayval']]['val'] = intval($v['allnum']);
  214. }
  215. if ($curr_month == $v['monthval']){
  216. $curr_arr[$v['dayval']] = intval($v['allnum']);
  217. $currlist_arr[$v['dayval']]['val'] = intval($v['allnum']);
  218. }
  219. }
  220. }
  221. $stat_arr['series'][0]['name'] = '上月';
  222. $stat_arr['series'][0]['data'] = array_values($up_arr);
  223. $stat_arr['series'][1]['name'] = '本月';
  224. $stat_arr['series'][1]['data'] = array_values($curr_arr);
  225. //统计数据标题
  226. $statlist['headertitle'] = array('日期','上月','本月','同比');
  227. Tpl::output('actionurl',$actionurl.'&search_type=month&search_time_year='.$current_year.'&search_time_month='.$current_month);
  228. }
  229. //计算同比
  230. foreach ((array)$currlist_arr as $k=>$v){
  231. $tmp = array();
  232. $tmp['seartime'] = $v['stime'].'|'.$v['etime'];
  233. $tmp['timetext'] = $v['timetext'];
  234. $tmp['currentdata'] = $v['val'];
  235. $tmp['updata'] = $uplist_arr[$k]['val'];
  236. $tmp['tbrate'] = getTb($tmp['updata'], $tmp['currentdata']);
  237. $statlist['data'][] = $tmp;
  238. }
  239. //导出Excel
  240. if ($_GET['exporttype'] == 'excel'){
  241. //导出Excel
  242. import('libraries.excel');
  243. $excel_obj = new Excel();
  244. $excel_data = array();
  245. //设置样式
  246. $excel_obj->setStyle(array('id'=>'s_title','Font'=>array('FontName'=>'宋体','Size'=>'12','Bold'=>'1')));
  247. //header
  248. foreach ($statlist['headertitle'] as $v){
  249. $excel_data[0][] = array('styleid'=>'s_title','data'=>$v);
  250. }
  251. //data
  252. foreach ($statlist['data'] as $k=>$v){
  253. $excel_data[$k+1][] = array('data'=>$v['timetext']);
  254. $excel_data[$k+1][] = array('format'=>'Number','data'=>$v['updata']);
  255. $excel_data[$k+1][] = array('format'=>'Number','data'=>$v['currentdata']);
  256. $excel_data[$k+1][] = array('data'=>$v['tbrate']);
  257. }
  258. $excel_data = $excel_obj->charset($excel_data,CHARSET);
  259. $excel_obj->addArray($excel_data);
  260. $excel_obj->addWorksheet($excel_obj->charset('新增店铺统计',CHARSET));
  261. $excel_obj->generateXML($excel_obj->charset('新增店铺统计',CHARSET).date('Y-m-d-H',time()));
  262. exit();
  263. } else {
  264. //得到统计图数据
  265. $stat_arr['title'] = '新增店铺统计';
  266. $stat_arr['yAxis'] = '新增店铺数';
  267. $stat_json = getStatData_LineLabels($stat_arr);
  268. Tpl::output('stat_json',$stat_json);
  269. Tpl::output('statlist',$statlist);
  270. Tpl::output('top_link',$this->sublink($this->links, 'newstore'));
  271. Tpl::showpage('stat.newstore');
  272. }
  273. }
  274. /**
  275. * 热卖排行
  276. */
  277. public function hotrankOp(){
  278. if(!$this->search_arr['search_type']){
  279. $this->search_arr['search_type'] = 'day';
  280. }
  281. $model = Model('stat');
  282. //获得搜索的开始时间和结束时间
  283. $searchtime_arr = $model->getStarttimeAndEndtime($this->search_arr);
  284. Tpl::output('searchtime',implode('|',$searchtime_arr));
  285. Tpl::output('top_link',$this->sublink($this->links, 'hotrank'));
  286. Tpl::showpage('stat.store.hotrank');
  287. }
  288. /**
  289. * 热卖排行列表
  290. */
  291. public function hotrank_listOp(){
  292. $datanum = 30;
  293. $model = Model('stat');
  294. switch ($_GET['type']){
  295. case 'ordernum':
  296. $sort_text = '下单量';
  297. break;
  298. default:
  299. $_GET['type'] = 'orderamount';
  300. $sort_text = '下单金额';
  301. break;
  302. }
  303. $where = array();
  304. $searchtime_arr_tmp = explode('|',$this->search_arr['t']);
  305. foreach ((array)$searchtime_arr_tmp as $k=>$v){
  306. $searchtime_arr[] = intval($v);
  307. }
  308. //店铺分类
  309. $search_sclass = intval($_REQUEST['search_sclass']);
  310. if ($search_sclass){
  311. $where['sc_id'] = $search_sclass;
  312. }
  313. $where['order_isvalid'] = 1;//计入统计的有效订单
  314. $where['order_add_time'] = array('between',$searchtime_arr);
  315. //查询统计数据
  316. $field = ' store_id,store_name ';
  317. switch ($_GET['type']){
  318. case 'ordernum':
  319. $field .= ' ,COUNT(*) as ordernum ';
  320. $orderby = 'ordernum desc';
  321. break;
  322. default:
  323. $_GET['type'] = 'orderamount';
  324. $field .= ' ,SUM(order_amount) as orderamount ';
  325. $orderby = 'orderamount desc';
  326. break;
  327. }
  328. $orderby .= ',store_id';
  329. $statlist = $model->statByStatorder($where, $field, 0, $datanum, $orderby, 'store_id');
  330. foreach ((array)$statlist as $k=>$v){
  331. $statlist[$k]['sort'] = $k+1;
  332. }
  333. /**
  334. * 飙升榜
  335. */
  336. $soaring_statlist = array();//飙升榜数组
  337. //查询期间产生订单的店铺数
  338. $where = array();
  339. //店铺分类
  340. $search_sclass = intval($_REQUEST['search_sclass']);
  341. if ($search_sclass){
  342. $where['sc_id'] = $search_sclass;
  343. }
  344. $where['order_isvalid'] = 1;//计入统计的有效订单
  345. $where['order_add_time'] = array('between',$searchtime_arr);
  346. $field = 'COUNT(*) as countnum';
  347. $countnum = $model->getoneByStatorder($where, $field);
  348. $countnum = $countnum['countnum'];
  349. if ($countnum > 0){
  350. $store_arr = array();
  351. $field = 'store_id,store_name,order_amount';
  352. for ($i=0; $i<$countnum; $i+=1000){//由于数据库底层的限制,所以每次查询1000条
  353. $order_list = array();
  354. $order_list = $model->statByStatorder($where, $field, 0, $i.',1000', 'order_id');
  355. foreach ((array)$order_list as $k=>$v){
  356. $store_arr[$v['store_id']]['orderamount'] = $store_arr[$v['store_id']]['orderamount'] + $v['order_amount'];
  357. $store_arr[$v['store_id']]['ordernum'] = intval($store_arr[$v['store_id']]['ordernum']) + 1;
  358. $store_arr[$v['store_id']]['store_name'] = $v['store_name'];
  359. $store_arr[$v['store_id']]['store_id'] = $v['store_id'];
  360. }
  361. }
  362. //查询同一时间周期相比的环比数值
  363. $where = array();
  364. $stime = $searchtime_arr[0] - ($searchtime_arr[1] - $searchtime_arr[0]) - 1;
  365. $etime = $searchtime_arr[0] - 1;
  366. //店铺分类
  367. $search_sclass = intval($_REQUEST['search_sclass']);
  368. if ($search_sclass){
  369. $where['sc_id'] = $search_sclass;
  370. }
  371. $where['order_isvalid'] = 1;//计入统计的有效订单
  372. $where['order_add_time'] = array('between',array($stime,$etime));
  373. $field = 'COUNT(*) as up_countnum';
  374. $up_countnum = $model->getoneByStatorder($where, $field);
  375. $up_countnum = $up_countnum['up_countnum'];
  376. $up_store_arr = array();
  377. if ($up_countnum > 0){
  378. $field = 'store_id,store_name,order_amount';
  379. for ($i=0; $i<$up_countnum; $i+=1000){//由于数据库底层的限制,所以每次查询1000条
  380. $order_list = array();
  381. $order_list = $model->statByStatorder($where, $field, 0, $i.',1000', 'store_id');
  382. foreach ((array)$order_list as $k=>$v){
  383. $up_store_arr[$v['store_id']]['orderamount'] = $up_store_arr[$v['store_id']]['orderamount'] + $v['order_amount'];
  384. $up_store_arr[$v['store_id']]['ordernum'] = intval($up_store_arr[$v['store_id']]['ordernum']) + 1;
  385. }
  386. }
  387. }
  388. //计算环比飙升数值
  389. $soaring_arr = array();
  390. foreach ((array)$store_arr as $k=>$v){
  391. if ($up_store_arr[$k][$_GET['type']] > 0){//上期数值大于0,则计算飙升值,否则不计入统计
  392. $soaring_arr[$k] = round((($v[$_GET['type']]-$up_store_arr[$k][$_GET['type']])/$up_store_arr[$k][$_GET['type']]*100),2);
  393. }
  394. }
  395. arsort($soaring_arr);//降序排列数组
  396. $i = 1;
  397. //取出前10名飙升店铺
  398. foreach ((array)$soaring_arr as $k=>$v){
  399. if ($i <= $datanum){
  400. $tmp = array();
  401. $tmp['sort'] = $i;
  402. $tmp['store_name'] = $store_arr[$k]['store_name'];
  403. $tmp['store_id'] = $store_arr[$k]['store_id'];
  404. $tmp['hb'] = $v;
  405. switch ($_GET['type']){
  406. case 'ordernum':
  407. $tmp['ordernum'] = $store_arr[$k]['ordernum'];
  408. break;
  409. case 'orderamount':
  410. $tmp['orderamount'] = ncPriceFormat($store_arr[$k]['orderamount']);
  411. break;
  412. }
  413. $soaring_statlist[] = $tmp;
  414. $i++;
  415. } else {
  416. break;
  417. }
  418. }
  419. }
  420. Tpl::output('soaring_statlist',$soaring_statlist);
  421. Tpl::output('statlist',$statlist);
  422. Tpl::output('sort_text',$sort_text);
  423. Tpl::output('stat_field',$_GET['type']);
  424. Tpl::showpage('stat.store.hotrank.list','null_layout');
  425. }
  426. /**
  427. * 店铺等级
  428. */
  429. public function degreeOp(){
  430. $where = array();
  431. $field = ' count(*) as allnum,grade_id ';
  432. $model = Model('stat');
  433. //查询店铺分类下的店铺
  434. $search_sclass = intval($_REQUEST['search_sclass']);
  435. if ($search_sclass > 0){
  436. $where['sc_id'] = $search_sclass;
  437. }
  438. $storelist = $model->getNewStoreStatList($where, $field, 0, '', 0, 'grade_id');
  439. $sd_list = $model->getStoreDegree();
  440. $statlist['headertitle'] = array();
  441. $statlist['data'] = array();
  442. //处理数组数据
  443. if(!empty($storelist)){
  444. foreach ($storelist as $k=>$v){
  445. $storelist[$k]['p_name'] = $v['grade_id'] > 0?$sd_list[$v['grade_id']]:'平台店铺';
  446. $storelist[$k]['allnum'] = intval($v['allnum']);
  447. $statlist['headertitle'][] = $v['grade_id'] > 0?$sd_list[$v['grade_id']]:'平台店铺';
  448. $statlist['data'][] = $v['allnum'];
  449. }
  450. $data = array(
  451. 'title'=>'店铺等级统计',
  452. 'name'=>'店铺个数',
  453. 'label_show'=>true,
  454. 'series'=>$storelist
  455. );
  456. Tpl::output('stat_json',getStatData_Pie($data));
  457. }
  458. Tpl::output('top_link',$this->sublink($this->links, 'degree'));
  459. Tpl::showpage('stat.storedegree');
  460. }
  461. /**
  462. * 查看店铺列表
  463. */
  464. public function showstoreOp(){
  465. $model = Model('stat');
  466. $where = array();
  467. if (in_array($_GET['type'],array('newbyday','newbyweek','newbymonth','storearea'))){
  468. $actionurl = 'index.php?act=stat_store&op=showstore&type='.$_GET['type'].'&t='.$this->search_arr['t'];
  469. $searchtime_arr_tmp = explode('|',$this->search_arr['t']);
  470. foreach ((array)$searchtime_arr_tmp as $k=>$v){
  471. $searchtime_arr[] = intval($v);
  472. }
  473. $where['store_time'] = array('between',$searchtime_arr);
  474. }
  475. //商品分类
  476. $sc_id = intval($_GET['scid']);
  477. if ($sc_id > 0){
  478. $where['sc_id'] = $sc_id;
  479. $actionurl .="&scid=$sc_id";
  480. }
  481. //省份
  482. if (isset($_GET['provid'])){
  483. $province_id = intval($_GET['provid']);
  484. $where['province_id'] = $province_id;
  485. $actionurl .="&provid=$province_id";
  486. }
  487. if ($_GET['exporttype'] == 'excel'){
  488. $store_list = $model->getNewStoreStatList($where);
  489. } else {
  490. $store_list = $model->getNewStoreStatList($where, '', 10);
  491. }
  492. //店铺等级
  493. $model_grade = Model('store_grade');
  494. $grade_list = $model_grade->getGradeList();
  495. if (!empty($grade_list)){
  496. $search_grade_list = array();
  497. foreach ($grade_list as $k => $v){
  498. $search_grade_list[$v['sg_id']] = $v['sg_name'];
  499. }
  500. }
  501. //导出Excel
  502. if ($_GET['exporttype'] == 'excel'){
  503. //导出Excel
  504. import('libraries.excel');
  505. $excel_obj = new Excel();
  506. $excel_data = array();
  507. //设置样式
  508. $excel_obj->setStyle(array('id'=>'s_title','Font'=>array('FontName'=>'宋体','Size'=>'12','Bold'=>'1')));
  509. //header
  510. $excel_data[0][] = array('styleid'=>'s_title','data'=>'店铺名称');
  511. $excel_data[0][] = array('styleid'=>'s_title','data'=>'店主账号');
  512. $excel_data[0][] = array('styleid'=>'s_title','data'=>'店主卖家账号');
  513. $excel_data[0][] = array('styleid'=>'s_title','data'=>'所属等级');
  514. $excel_data[0][] = array('styleid'=>'s_title','data'=>'有效期至');
  515. $excel_data[0][] = array('styleid'=>'s_title','data'=>'开店时间');
  516. //data
  517. foreach ($store_list as $k=>$v){
  518. $excel_data[$k+1][] = array('data'=>$v['store_name']);
  519. $excel_data[$k+1][] = array('data'=>$v['member_name']);
  520. $excel_data[$k+1][] = array('data'=>$v['seller_name']);
  521. $excel_data[$k+1][] = array('data'=>$search_grade_list[$v['grade_id']]);
  522. $excel_data[$k+1][] = array('data'=>$v['store_end_time']?date('Y-m-d', $v['store_end_time']):'无限制');
  523. $excel_data[$k+1][] = array('data'=>date('Y-m-d', $v['store_time']));
  524. }
  525. $excel_data = $excel_obj->charset($excel_data,CHARSET);
  526. $excel_obj->addArray($excel_data);
  527. $excel_obj->addWorksheet($excel_obj->charset('新增店铺',CHARSET));
  528. $excel_obj->generateXML($excel_obj->charset('新增店铺',CHARSET).date('Y-m-d-H',time()));
  529. exit();
  530. }
  531. Tpl::output('search_grade_list', $search_grade_list);
  532. Tpl::output('actionurl',$actionurl);
  533. Tpl::output('store_list',$store_list);
  534. Tpl::output('show_page',$model->showpage(2));
  535. $this->links[] = array('url'=>'act=stat_store&op=showstore','lang'=>'stat_storelist');
  536. Tpl::output('top_link',$this->sublink($this->links, 'showstore'));
  537. Tpl::showpage('stat.info.storelist');
  538. }
  539. /**
  540. * 销售统计
  541. */
  542. public function storesalesOp(){
  543. if(!$this->search_arr['search_type']){
  544. $this->search_arr['search_type'] = 'day';
  545. }
  546. $model = Model('stat');
  547. //获得搜索的开始时间和结束时间
  548. $searchtime_arr = $model->getStarttimeAndEndtime($this->search_arr);
  549. Tpl::output('searchtime',implode('|',$searchtime_arr));
  550. Tpl::output('top_link',$this->sublink($this->links, 'storesales'));
  551. Tpl::showpage('stat.store.sales');
  552. }
  553. /**
  554. * 店铺销售统计列表
  555. */
  556. public function storesales_listOp(){
  557. $model = Model('stat');
  558. $searchtime_arr_tmp = explode('|',$this->search_arr['t']);
  559. foreach ((array)$searchtime_arr_tmp as $k=>$v){
  560. $searchtime_arr[] = intval($v);
  561. }
  562. $where = array();
  563. $where['order_isvalid'] = 1;//计入统计的有效订单
  564. $where['order_add_time'] = array('between',$searchtime_arr);
  565. //店铺分类
  566. $search_sclass = intval($_REQUEST['search_sclass']);
  567. if ($search_sclass){
  568. $where['sc_id'] = $search_sclass;
  569. }
  570. //店铺名称
  571. $where['store_name'] = array('like',"%{$_GET['search_sname']}%");
  572. //查询总条数
  573. $count_arr = $model->getoneByStatorder($where, 'COUNT(DISTINCT store_id) as countnum');
  574. $countnum = intval($count_arr['countnum']);
  575. //列表字段
  576. $field = " store_id,store_name,SUM(order_amount) as orderamount, COUNT(*) as ordernum, COUNT(DISTINCT buyer_id) as membernum";
  577. //排序
  578. $orderby_arr = array('membernum asc','membernum desc','ordernum asc','ordernum desc','orderamount asc','orderamount desc');
  579. if (!in_array(trim($this->search_arr['orderby']),$orderby_arr)){
  580. $this->search_arr['orderby'] = 'membernum desc';
  581. }
  582. $orderby = trim($this->search_arr['orderby']).',store_id asc';
  583. if ($this->search_arr['exporttype'] == 'excel'){
  584. $statlist = $model->statByStatorder($where, $field, 0, 0, $orderby, 'store_id');
  585. } else {
  586. $statlist = $model->statByStatorder($where, $field, array(20,$countnum), 0, $orderby, 'store_id');
  587. foreach ((array)$statlist as $k=>$v){
  588. $v['view'] = "<a href='javascript:void(0);' nc_type='showtrends' data-param='{\"storeid\":\"{$v['store_id']}\"}'>走势图</a>";
  589. $statlist[$k] = $v;
  590. }
  591. }
  592. //列表header
  593. $statheader = array();
  594. $statheader[] = array('text'=>'店铺名称','key'=>'store_name');
  595. $statheader[] = array('text'=>'下单会员数','key'=>'membernum','isorder'=>1);
  596. $statheader[] = array('text'=>'下单量','key'=>'ordernum','isorder'=>1);
  597. $statheader[] = array('text'=>'下单金额','key'=>'orderamount','isorder'=>1);
  598. //导出Excel
  599. if ($this->search_arr['exporttype'] == 'excel'){
  600. //导出Excel
  601. import('libraries.excel');
  602. $excel_obj = new Excel();
  603. $excel_data = array();
  604. //设置样式
  605. $excel_obj->setStyle(array('id'=>'s_title','Font'=>array('FontName'=>'宋体','Size'=>'12','Bold'=>'1')));
  606. //header
  607. foreach ($statheader as $k=>$v){
  608. $excel_data[0][] = array('styleid'=>'s_title','data'=>$v['text']);
  609. }
  610. //data
  611. foreach ($statlist as $k=>$v){
  612. foreach ($statheader as $h_k=>$h_v){
  613. $excel_data[$k+1][] = array('data'=>$v[$h_v['key']]);
  614. }
  615. }
  616. $excel_data = $excel_obj->charset($excel_data,CHARSET);
  617. $excel_obj->addArray($excel_data);
  618. $excel_obj->addWorksheet($excel_obj->charset('店铺销售统计',CHARSET));
  619. $excel_obj->generateXML($excel_obj->charset('店铺销售统计',CHARSET).date('Y-m-d-H',time()));
  620. exit();
  621. }
  622. Tpl::output('statlist',$statlist);
  623. Tpl::output('statheader',$statheader);
  624. Tpl::output('orderby',$this->search_arr['orderby']);
  625. Tpl::output('actionurl',"index.php?act={$this->search_arr['act']}&op={$this->search_arr['op']}&t={$this->search_arr['t']}&search_sclass={$search_sclass}&search_sname={$_GET['search_sname']}");
  626. Tpl::output('show_page',$model->showpage(2));
  627. Tpl::showpage('stat.listandorder','null_layout');
  628. }
  629. /**
  630. * 销售走势
  631. */
  632. public function storesales_trendsOp(){
  633. $storeid = intval($_GET['storeid']);
  634. if ($storeid <= 0){
  635. Tpl::output('stat_error','走势图加载错误');
  636. Tpl::showpage('stat.store.salestrends');
  637. exit();
  638. }
  639. if (!$_GET['search_type']){
  640. $_GET['search_type'] = 'day';
  641. }
  642. $model = Model('stat');
  643. $where = array();
  644. $where['store_id'] = $storeid;
  645. $searchtime_arr_tmp = explode('|',$this->search_arr['t']);
  646. foreach ((array)$searchtime_arr_tmp as $k=>$v){
  647. $searchtime_arr[] = intval($v);
  648. }
  649. $where['order_isvalid'] = 1;//计入统计的有效订单
  650. $where['order_add_time'] = array('between',$searchtime_arr);
  651. $field = " store_id,store_name,SUM(order_amount) as orderamount, COUNT(*) as ordernum, COUNT(DISTINCT buyer_id) as membernum";
  652. $stat_arr = array('orderamount'=>array(),'ordernum'=>array(),'membernum'=>array());
  653. $statlist = array();
  654. if($_GET['search_type'] == 'day'){
  655. //构造横轴数据
  656. for($i=0; $i<24; $i++){
  657. //横轴
  658. foreach ($stat_arr as $k=>$v){
  659. $stat_arr[$k]['xAxis']['categories'][] = "$i";
  660. $statlist[$k][$i] = 0;
  661. }
  662. }
  663. $field .= ' ,HOUR(FROM_UNIXTIME(order_add_time)) as timeval ';
  664. }
  665. if($_GET['search_type'] == 'week'){
  666. //构造横轴数据
  667. for($i=1; $i<=7; $i++){
  668. $tmp_weekarr = getSystemWeekArr();
  669. //横轴
  670. foreach ($stat_arr as $k=>$v){
  671. $stat_arr[$k]['xAxis']['categories'][] = $tmp_weekarr[$i];
  672. $statlist[$k][$i] = 0;
  673. }
  674. unset($tmp_weekarr);
  675. }
  676. $field .= ' ,WEEKDAY(FROM_UNIXTIME(order_add_time))+1 as timeval ';
  677. }
  678. if($_GET['search_type'] == 'month'){
  679. //计算横轴的最大量(由于每个月的天数不同)
  680. $dayofmonth = date('t',$searchtime_arr[0]);
  681. //构造横轴数据
  682. for($i=1; $i<=$dayofmonth; $i++){
  683. //横轴
  684. foreach ($stat_arr as $k=>$v){
  685. $stat_arr[$k]['xAxis']['categories'][] = $i;
  686. $statlist[$k][$i] = 0;
  687. }
  688. }
  689. $field .= ' ,day(FROM_UNIXTIME(order_add_time)) as timeval ';
  690. }
  691. //查询数据
  692. $statlist_tmp = $model->statByStatorder($where, $field, 0, '', 'timeval','timeval');
  693. //整理统计数组
  694. $storename = '';
  695. if($statlist_tmp){
  696. foreach($statlist_tmp as $k => $v){
  697. $storename = $v['store_name'];
  698. foreach ($stat_arr as $t_k=>$t_v){
  699. if ($k == 'orderamount'){
  700. $statlist[$t_k][$v['timeval']] = round($v[$t_k],2);
  701. } else {
  702. $statlist[$t_k][$v['timeval']] = intval($v[$t_k]);
  703. }
  704. }
  705. }
  706. }
  707. foreach ($stat_arr as $k=>$v){
  708. $stat_arr[$k]['legend']['enabled'] = false;
  709. switch ($k){
  710. case 'orderamount':
  711. $caption = '下单金额';
  712. break;
  713. case 'ordernum':
  714. $caption = '下单量';
  715. break;
  716. default:
  717. $caption = '下单会员数';
  718. break;
  719. }
  720. $stat_arr[$k]['series'][0]['name'] = $caption;
  721. $stat_arr[$k]['series'][0]['data'] = array_values($statlist[$k]);
  722. $stat_arr[$k]['title'] = $caption.'走势';
  723. $stat_arr[$k]['yAxis'] = $caption;
  724. //得到统计图数据
  725. $stat_json[$k] = getStatData_LineLabels($stat_arr[$k]);
  726. }
  727. Tpl::output('storename',$storename);
  728. Tpl::output('stat_json',$stat_json);
  729. Tpl::showpage('stat.store.salestrends','null_layout');
  730. }
  731. /**
  732. * 地区分布
  733. */
  734. public function storeareaOp(){
  735. $model = Model('stat');
  736. //获得搜索的开始时间和结束时间
  737. $searchtime_arr = $model->getStarttimeAndEndtime($this->search_arr);
  738. $where = array();
  739. if (trim($_GET['search_time'])){
  740. $where['store_time'] = array('elt',strtotime($_GET['search_time']));
  741. }
  742. $search_sclass = intval($_REQUEST['search_sclass']);
  743. if ($search_sclass > 0){
  744. $where['sc_id'] = $search_sclass;
  745. }
  746. $field = ' province_id, COUNT(*) as storenum ';
  747. $statlist_tmp = $model->statByStore($where, $field, 0, 0, 'storenum desc,province_id', 'province_id');
  748. // 地区
  749. $province_array = Model('area')->getTopLevelAreas();
  750. //地图显示等级数组
  751. $level_arr = array(array(1,2,3),array(4,5,6),array(7,8,9),array(10,11,12));
  752. $statlist = array();
  753. foreach ((array)$statlist_tmp as $k=>$v){
  754. $v['level'] = 4;//排名
  755. foreach ($level_arr as $lk=>$lv){
  756. if (in_array($k+1,$lv)){
  757. $v['level'] = $lk;//排名
  758. }
  759. }
  760. $province_id = intval($v['province_id']);
  761. $v['sort'] = $k+1;
  762. $v['provincename'] = ($t = $province_array[$province_id]) ? $t : '其他';
  763. $statlist[$province_id] = $v;
  764. }
  765. $stat_arr = array();
  766. foreach ((array)$province_array as $k=>$v){
  767. if ($statlist[$k]){
  768. $stat_arr[] = array('cha'=>$k,'name'=>$v,'des'=>",店铺量:{$statlist[$k]['storenum']}",'level'=>$statlist[$k]['level']);
  769. } else {
  770. $stat_arr[] = array('cha'=>$k,'name'=>$v,'des'=>',无订单数据','level'=>4);
  771. }
  772. }
  773. $stat_json = getStatData_Map($stat_arr);
  774. Tpl::output('stat_json',$stat_json);
  775. Tpl::output('statlist',$statlist);
  776. $actionurl = 'index.php?act=stat_store&op=showstore&type=storearea';
  777. if (trim($_GET['search_time'])){
  778. $actionurl = $actionurl.'&t=0|'.strtotime($_GET['search_time']);
  779. }
  780. if ($search_sclass > 0){
  781. $actionurl .= "&scid=$search_sclass";
  782. }
  783. Tpl::output('actionurl',$actionurl);
  784. Tpl::output('top_link',$this->sublink($this->links, 'storearea'));
  785. Tpl::showpage('stat.storearea');
  786. }
  787. }