123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940 |
- <?php
- /**
- * 店铺统计
- */
- namespace app\admin\controller;
- use think\facade\View;
- use think\facade\Db;
- use excel\Excel;
- use think\facade\Lang;
- /**
-
- *
-
- *
- * ----------------------------------------------------------------------------
- *
-
- * 控制器
- */
- class Statstore extends AdminControl
- {
- private $search_arr; //处理后的参数
- private $store_class; //店铺分类
- public function initialize()
- {
- parent::initialize(); // TODO: Change the autogenerated stub
- Lang::load(base_path() . 'admin/lang/' . config('lang.default_lang') . '/stat.lang.php');
- include_once root_path() . 'extend/mall/statistics.php';
- include_once root_path() . 'extend/mall/datehelper.php';
- $stat_model = model('stat');
- //存储参数
- $this->search_arr = input('param.');
- //处理搜索时间
- if (in_array(request()->action(), array('hotrank', 'storesales'))) {
- $this->search_arr = $stat_model->dealwithSearchTime($this->search_arr);
- //获得系统年份
- $year_arr = getSystemYearArr();
- //获得系统月份
- $month_arr = getSystemMonthArr();
- //获得本月的周时间段
- $week_arr = getMonthWeekArr($this->search_arr['week']['current_year'], $this->search_arr['week']['current_month']);
- View::assign('year_arr', $year_arr);
- View::assign('month_arr', $month_arr);
- View::assign('week_arr', $week_arr);
- }
- View::assign('search_arr', $this->search_arr);
- //店铺分类
- $this->store_class = rkcache('storeclass', true);
- View::assign('store_class', $this->store_class);
- }
- /**
- * 新增店铺
- */
- public function newstore()
- {
- //导出excel连接地址
- $actionurl = (string)url('Statstore/newstore');
- $where = array();
- //所属店铺分类
- $search_sclass = intval(input('param.search_sclass'));
- if ($search_sclass > 0) {
- $where[] = array('storeclass_id', '=', $search_sclass);;
- $actionurl .= "&search_sclass=$search_sclass";
- }
- $field = ' count(*) as allnum ';
- if (!input('param.search_type')) {
- $search_type = 'day';
- } else {
- $search_type = input('param.search_type');
- }
- //初始化时间
- //天
- if (!input('param.search_time')) {
- $search_times = date('Y-m-d', TIMESTAMP - 86400);
- } else {
- $search_times = input('param.search_time');
- }
- $search_time = strtotime($search_times); //搜索的时间
- View::assign('search_time', $search_times);
- //周
- if (!input('param.search_time_year')) {
- $search_time_year = date('Y', TIMESTAMP);
- } else {
- $search_time_year = input('param.search_time_year');
- }
- if (!input('param.search_time_month')) {
- $search_time_month = date('m', TIMESTAMP);
- } else {
- $search_time_month = input('param.search_time_month');
- }
- if (!input('param.search_time_week')) {
- $search_time_week = implode('|', getWeek_SdateAndEdate(TIMESTAMP));
- } else {
- $search_time_week = input('param.search_time_week');
- }
- $current_year = $search_time_year;
- $current_month = $search_time_month;
- $current_week = $search_time_week;
- $year_arr = getSystemYearArr();
- $month_arr = getSystemMonthArr();
- $week_arr = getMonthWeekArr($current_year, $current_month);
- View::assign('current_year', $current_year);
- View::assign('current_month', $current_month);
- View::assign('current_week', $current_week);
- View::assign('year_arr', $year_arr);
- View::assign('month_arr', $month_arr);
- View::assign('week_arr', $week_arr);
- $stat_model = model('stat');
- $statlist = array(); //统计数据列表
- if ($search_type == 'day') {
- //构造横轴数据
- for ($i = 0; $i < 24; $i++) {
- //统计图数据
- $curr_arr[$i] = 0; //今天
- $up_arr[$i] = 0; //昨天
- //统计表数据
- $uplist_arr[$i]['timetext'] = $i;
- $currlist_arr[$i]['timetext'] = $i;
- //方便搜索会员列表,计算开始时间和结束时间
- $currlist_arr[$i]['stime'] = $search_time + $i * 3600;
- $currlist_arr[$i]['etime'] = $currlist_arr[$i]['stime'] + 3600;
- $uplist_arr[$i]['val'] = 0;
- $currlist_arr[$i]['val'] = 0;
- //横轴
- $stat_arr['xAxis']['categories'][] = "$i";
- }
- $stime = $search_time - 86400; //昨天0点
- $etime = $search_time + 86400 - 1; //今天24点
- $today_day = @date('d', $search_time); //今天日期
- $yesterday_day = @date('d', $stime); //昨天日期
- $where[] = array('store_addtime', 'between', array($stime, $etime));
- $field .= ' ,DAY(FROM_UNIXTIME(store_addtime)) as dayval,HOUR(FROM_UNIXTIME(store_addtime)) as hourval ';
- $memberlist = $stat_model->getNewStoreStatList($where, $field, 0, '', 0, 'dayval,dayval');
- if ($memberlist) {
- foreach ($memberlist as $k => $v) {
- if ($today_day == $v['dayval']) {
- $curr_arr[$v['hourval']] = intval($v['allnum']);
- $currlist_arr[$v['hourval']]['val'] = intval($v['allnum']);
- }
- if ($yesterday_day == $v['dayval']) {
- $up_arr[$v['hourval']] = intval($v['allnum']);
- $uplist_arr[$v['hourval']]['val'] = intval($v['allnum']);
- }
- }
- }
- $stat_arr['series'][0]['name'] = lang('yestoday');
- $stat_arr['series'][0]['data'] = array_values($up_arr);
- $stat_arr['series'][1]['name'] = lang('today');
- $stat_arr['series'][1]['data'] = array_values($curr_arr);
- //统计数据标题
- $statlist['headertitle'] = array(lang('hour'), lang('yestoday'), lang('today'), lang('compare_to'));
- View::assign('actionurl', $actionurl . '&search_type=day&search_time=' . date('Y-m-d', $search_time));
- }
- if ($search_type == 'week') {
- $current_weekarr = explode('|', $current_week);
- $stime = strtotime($current_weekarr[0]) - 86400 * 7;
- $etime = strtotime($current_weekarr[1]) + 86400 - 1;
- $up_week = @date('W', $stime); //上周
- $curr_week = @date('W', $etime); //本周
- //构造横轴数据
- for ($i = 1; $i <= 7; $i++) {
- //统计图数据
- $up_arr[$i] = 0;
- $curr_arr[$i] = 0;
- $tmp_weekarr = getSystemWeekArr();
- //统计表数据
- $uplist_arr[$i]['timetext'] = $tmp_weekarr[$i];
- $currlist_arr[$i]['timetext'] = $tmp_weekarr[$i];
- //方便搜索会员列表,计算开始时间和结束时间
- $currlist_arr[$i]['stime'] = strtotime($current_weekarr[0]) + ($i - 1) * 86400;
- $currlist_arr[$i]['etime'] = $currlist_arr[$i]['stime'] + 86400 - 1;
- $uplist_arr[$i]['val'] = 0;
- $currlist_arr[$i]['val'] = 0;
- //横轴
- $stat_arr['xAxis']['categories'][] = $tmp_weekarr[$i];
- unset($tmp_weekarr);
- }
- $where[] = array('store_addtime', 'between', array($stime, $etime));
- $field .= ',WEEKOFYEAR(FROM_UNIXTIME(store_addtime)) as weekval,WEEKDAY(FROM_UNIXTIME(store_addtime))+1 as dayofweekval ';
- $memberlist = $stat_model->getNewStoreStatList($where, $field, 0, '', 0, 'weekval,dayofweekval');
- if ($memberlist) {
- foreach ($memberlist as $k => $v) {
- if ($up_week == $v['weekval']) {
- $up_arr[$v['dayofweekval']] = intval($v['allnum']);
- $uplist_arr[$v['dayofweekval']]['val'] = intval($v['allnum']);
- }
- if ($curr_week == $v['weekval']) {
- $curr_arr[$v['dayofweekval']] = intval($v['allnum']);
- $currlist_arr[$v['dayofweekval']]['val'] = intval($v['allnum']);
- }
- }
- }
- $stat_arr['series'][0]['name'] = lang('last_week');
- $stat_arr['series'][0]['data'] = array_values($up_arr);
- $stat_arr['series'][1]['name'] = lang('this_week');
- $stat_arr['series'][1]['data'] = array_values($curr_arr);
- //统计数据标题
- $statlist['headertitle'] = array(lang('week'), lang('last_week'), lang('this_week'), lang('compare_to'));
- View::assign('actionurl', $actionurl . '&search_type=week&search_time_year=' . $current_year . '&search_time_month=' . $current_month . '&search_time_week=' . $current_week);
- }
- if ($search_type == 'month') {
- $stime = strtotime($current_year . '-' . $current_month . "-01 -1 month");
- $etime = getMonthLastDay($current_year, $current_month) + 86400 - 1;
- $up_month = date('m', $stime);
- $curr_month = date('m', $etime);
- //计算横轴的最大量(由于每个月的天数不同)
- $up_dayofmonth = date('t', $stime);
- $curr_dayofmonth = date('t', $etime);
- $x_max = $up_dayofmonth > $curr_dayofmonth ? $up_dayofmonth : $curr_dayofmonth;
- //构造横轴数据
- for ($i = 1; $i <= $x_max; $i++) {
- //统计图数据
- $up_arr[$i] = 0;
- $curr_arr[$i] = 0;
- //统计表数据
- $uplist_arr[$i]['timetext'] = $i;
- $currlist_arr[$i]['timetext'] = $i;
- //方便搜索会员列表,计算开始时间和结束时间
- $currlist_arr[$i]['stime'] = strtotime($current_year . '-' . $current_month . "-01") + ($i - 1) * 86400;
- $currlist_arr[$i]['etime'] = $currlist_arr[$i]['stime'] + 86400 - 1;
- $uplist_arr[$i]['val'] = 0;
- $currlist_arr[$i]['val'] = 0;
- //横轴
- $stat_arr['xAxis']['categories'][] = $i;
- }
- $where[] = array('store_addtime', 'between', array($stime, $etime));
- $field .= ',MONTH(FROM_UNIXTIME(store_addtime)) as monthval,day(FROM_UNIXTIME(store_addtime)) as dayval ';
- $memberlist = $stat_model->getNewStoreStatList($where, $field, 0, '', 0, 'monthval,dayval');
- if ($memberlist) {
- foreach ($memberlist as $k => $v) {
- if ($up_month == $v['monthval']) {
- $up_arr[$v['dayval']] = intval($v['allnum']);
- $uplist_arr[$v['dayval']]['val'] = intval($v['allnum']);
- }
- if ($curr_month == $v['monthval']) {
- $curr_arr[$v['dayval']] = intval($v['allnum']);
- $currlist_arr[$v['dayval']]['val'] = intval($v['allnum']);
- }
- }
- }
- $stat_arr['series'][0]['name'] = lang('last_month');
- $stat_arr['series'][0]['data'] = array_values($up_arr);
- $stat_arr['series'][1]['name'] = lang('this_month');
- $stat_arr['series'][1]['data'] = array_values($curr_arr);
- //统计数据标题
- $statlist['headertitle'] = array(lang('date'), lang('last_month'), lang('this_month'), lang('compare_to'));
- View::assign('actionurl', $actionurl . '&search_type=month&search_time_year=' . $current_year . '&search_time_month=' . $current_month);
- }
- //计算同比
- foreach ((array)$currlist_arr as $k => $v) {
- $tmp = array();
- $tmp['seartime'] = $v['stime'] . '|' . $v['etime'];
- $tmp['timetext'] = $v['timetext'];
- $tmp['currentdata'] = $v['val'];
- $tmp['updata'] = $uplist_arr[$k]['val'];
- $tmp['tbrate'] = getTb($tmp['updata'], $tmp['currentdata']);
- $statlist['data'][] = $tmp;
- }
- //导出Excel
- if (input('param.exporttype') == 'excel') {
- //导出Excel
- $excel_obj = new \excel\Excel();
- $excel_data = array();
- //设置样式
- $excel_obj->setStyle(array('id' => 's_title', 'Font' => array('FontName' => '宋体', 'Size' => '12', 'Bold' => '1')));
- //header
- foreach ($statlist['headertitle'] as $v) {
- $excel_data[0][] = array('styleid' => 's_title', 'data' => $v);
- }
- //data
- foreach ($statlist['data'] as $k => $v) {
- $excel_data[$k + 1][] = array('data' => $v['timetext']);
- $excel_data[$k + 1][] = array('format' => 'Number', 'data' => $v['updata']);
- $excel_data[$k + 1][] = array('format' => 'Number', 'data' => $v['currentdata']);
- $excel_data[$k + 1][] = array('data' => $v['tbrate']);
- }
- $excel_data = $excel_obj->charset($excel_data, CHARSET);
- $excel_obj->addArray($excel_data);
- $excel_obj->addWorksheet($excel_obj->charset(lang('add_store_statis'), CHARSET));
- $excel_obj->generateXML($excel_obj->charset(lang('add_store_statis'), CHARSET) . date('Y-m-d-H', TIMESTAMP));
- exit();
- } else {
- //得到统计图数据
- $stat_arr['title'] = lang('add_store_statis');
- $stat_arr['yAxis'] = lang('add_store_number');
- $stat_json = getStatData_LineLabels($stat_arr);
- View::assign('stat_json', $stat_json);
- View::assign('statlist', $statlist);
- $this->setAdminCurItem('newstore');
- return View::fetch('stat_newstore');
- }
- }
- /**
- * 热卖排行
- */
- public function hotrank()
- {
- if (!isset($this->search_arr['search_type'])) {
- $this->search_arr['search_type'] = 'day';
- }
- $stat_model = model('stat');
- //获得搜索的开始时间和结束时间
- $searchtime_arr = $stat_model->getStarttimeAndEndtime($this->search_arr);
- View::assign('searchtime', implode('|', $searchtime_arr));
- //周
- if (!input('param.search_time_year')) {
- $search_time_year = date('Y', TIMESTAMP);
- } else {
- $search_time_year = input('param.search_time_year');
- }
- if (!input('param.search_time_month')) {
- $search_time_month = date('m', TIMESTAMP);
- } else {
- $search_time_month = input('param.search_time_month');
- }
- if (!input('param.search_time_week')) {
- $search_time_week = implode('|', getWeek_SdateAndEdate(TIMESTAMP));
- } else {
- $search_time_week = input('param.search_time_week');
- }
- $current_year = $search_time_year;
- $current_month = $search_time_month;
- $current_week = $search_time_week;
- View::assign('current_year', $current_year);
- View::assign('current_month', $current_month);
- View::assign('current_week', $current_week);
- $this->setAdminCurItem('hotrank');
- return View::fetch('store_hotrank');
- }
- /**
- * 热卖排行列表
- */
- public function hotrank_list()
- {
- $datanum = 30;
- $stat_model = model('stat');
- $type = input('param.type');
- switch ($type) {
- case 'ordernum':
- $sort_text = lang('statstore_ordernum');
- break;
- default:
- $type = 'orderamount';
- $sort_text = lang('statstore_orderamount');
- break;
- }
- $where = array();
- $searchtime_arr_tmp = explode('|', $this->search_arr['t']);
- foreach ((array)$searchtime_arr_tmp as $k => $v) {
- $searchtime_arr[] = intval($v);
- }
- //店铺分类
- $search_sclass = intval(input('param.search_sclass'));
- if ($search_sclass) {
- $where[] = array('storeclass_id', '=', $search_sclass);
- }
- $where[] = array('order_isvalid', '=', 1); //计入统计的有效订单
- $where[] = array('order_add_time', 'between', $searchtime_arr);
- //查询统计数据
- $field = ' store_id,store_name ';
- switch ($type) {
- case 'ordernum':
- $field .= ' ,COUNT(*) as ordernum ';
- $orderby = 'ordernum desc';
- break;
- default:
- $type = 'orderamount';
- $field .= ' ,SUM(order_amount) as orderamount ';
- $orderby = 'orderamount desc';
- break;
- }
- $orderby .= ',store_id';
- $statlist = $stat_model->statByStatorder($where, $field, 0, $datanum, $orderby, 'store_id');
- foreach ((array)$statlist as $k => $v) {
- $statlist[$k]['sort'] = $k + 1;
- }
- /**
- * 飙升榜
- */
- $soaring_statlist = array(); //飙升榜数组
- //查询期间产生订单的店铺数
- $where = array();
- //店铺分类
- $search_sclass = intval(input('param.search_sclass'));
- if ($search_sclass) {
- $where[] = array('storeclass_id', '=', $search_sclass);
- }
- $where[] = array('order_isvalid', '=', 1); //计入统计的有效订单
- $where[] = array('order_add_time', 'between', $searchtime_arr);
- $field = 'COUNT(*) as countnum';
- $countnum = $stat_model->getoneByStatorder($where, $field);
- $countnum = $countnum['countnum'];
- if ($countnum > 0) {
- $store_arr = array();
- $field = 'store_id,store_name,order_amount';
- for ($i = 0; $i < $countnum; $i += 1000) { //由于数据库底层的限制,所以每次查询1000条
- $order_list = array();
- $order_list = Db::name('statorder')->field($field)->where($where)->page($i, 1000)->order('order_id')->select()->toArray();
- foreach ((array)$order_list as $k => $v) {
- if (!isset($store_arr[$v['store_id']])) {
- $store_arr[$v['store_id']] = array();
- $store_arr[$v['store_id']]['orderamount'] = 0;
- $store_arr[$v['store_id']]['ordernum'] = 0;
- }
- $store_arr[$v['store_id']]['orderamount'] = $store_arr[$v['store_id']]['orderamount'] + $v['order_amount'];
- $store_arr[$v['store_id']]['ordernum'] = intval($store_arr[$v['store_id']]['ordernum']) + 1;
- $store_arr[$v['store_id']]['store_name'] = $v['store_name'];
- $store_arr[$v['store_id']]['store_id'] = $v['store_id'];
- }
- }
- //查询同一时间周期相比的环比数值
- $where = array();
- $stime = $searchtime_arr[0] - ($searchtime_arr[1] - $searchtime_arr[0]) - 1;
- $etime = $searchtime_arr[0] - 1;
- //店铺分类
- $search_sclass = intval($_REQUEST['search_sclass']);
- if ($search_sclass) {
- $where[] = array('storeclass_id', '=', $search_sclass);
- }
- $where[] = array('order_isvalid', '=', 1); //计入统计的有效订单
- $where[] = array('order_add_time', 'between', array($stime, $etime));
- $field = 'COUNT(*) as up_countnum';
- $up_countnum = $stat_model->getoneByStatorder($where, $field);
- $up_countnum = $up_countnum['up_countnum'];
- $up_store_arr = array();
- if ($up_countnum > 0) {
- $field = 'store_id,store_name,order_amount';
- for ($i = 0; $i < $up_countnum; $i += 1000) { //由于数据库底层的限制,所以每次查询1000条
- $order_list = array();
- $order_list = Db::name('statorder')->field($field)->where($where)->page($i, 1000)->order('store_id')->select()->toArray();
- foreach ((array)$order_list as $k => $v) {
- if (!isset($up_store_arr[$v['store_id']])) {
- $up_store_arr[$v['store_id']] = array('orderamount' => 0, 'ordernum' => 0);
- }
- $up_store_arr[$v['store_id']]['orderamount'] = $up_store_arr[$v['store_id']]['orderamount'] + $v['order_amount'];
- $up_store_arr[$v['store_id']]['ordernum'] = intval($up_store_arr[$v['store_id']]['ordernum']) + 1;
- }
- }
- }
- //计算环比飙升数值
- $soaring_arr = array();
- foreach ((array)$store_arr as $k => $v) {
- if (isset($up_store_arr[$k][$type]) && $up_store_arr[$k][$type] > 0) { //上期数值大于0,则计算飙升值,否则不计入统计
- $soaring_arr[$k] = round((($v[$type] - $up_store_arr[$k][$type]) / $up_store_arr[$k][$type] * 100), 2);
- }
- }
- arsort($soaring_arr); //降序排列数组
- $i = 1;
- //取出前10名飙升店铺
- foreach ((array)$soaring_arr as $k => $v) {
- if ($i <= $datanum) {
- $tmp = array();
- $tmp['sort'] = $i;
- $tmp['store_name'] = $store_arr[$k]['store_name'];
- $tmp['store_id'] = $store_arr[$k]['store_id'];
- $tmp['hb'] = $v;
- switch ($type) {
- case 'ordernum':
- $tmp['ordernum'] = $store_arr[$k]['ordernum'];
- break;
- case 'orderamount':
- $tmp['orderamount'] = ds_price_format($store_arr[$k]['orderamount']);
- break;
- }
- $soaring_statlist[] = $tmp;
- $i++;
- } else {
- break;
- }
- }
- }
- View::assign('soaring_statlist', $soaring_statlist);
- View::assign('statlist', $statlist);
- View::assign('sort_text', $sort_text);
- View::assign('stat_field', $type);
- echo View::fetch('store_hotrank_list');
- }
- /**
- * 店铺等级
- */
- public function degree()
- {
- $where = array();
- $field = ' count(*) as allnum,grade_id ';
- $stat_model = model('stat');
- //查询店铺分类下的店铺
- $search_sclass = input('param.search_sclass');
- if ($search_sclass > 0) {
- $where[] = array('storeclass_id', '=', $search_sclass);
- }
- $storelist = $stat_model->getNewStoreStatList($where, $field, 0, '', 0, 'grade_id');
- $sd_list = $stat_model->getStoreDegree();
- $statlist['headertitle'] = array();
- $statlist['data'] = array();
- //处理数组数据
- if (!empty($storelist)) {
- foreach ($storelist as $k => $v) {
- $storelist[$k]['p_name'] = isset($sd_list[$v['grade_id']]) > 0 ? $sd_list[$v['grade_id']] : lang('ds_ownshop');
- $storelist[$k]['allnum'] = intval($v['allnum']);
- $statlist['headertitle'][] = isset($sd_list[$v['grade_id']]) > 0 ? $sd_list[$v['grade_id']] : lang('ds_ownshop');
- $statlist['data'][] = $v['allnum'];
- }
- $data = array(
- 'title' => lang('store_grade_statis'),
- 'name' => lang('store_number'),
- 'label_show' => true,
- 'series' => $storelist
- );
- View::assign('stat_json', getStatData_Pie($data));
- }
- $this->setAdminCurItem('degree');
- return View::fetch('stat_storedegree');
- }
- /**
- * 查看店铺列表
- */
- public function showstore()
- {
- $stat_model = model('stat');
- $where = array();
- if (in_array(input('type'), array('newbyday', 'newbyweek', 'newbymonth', 'storearea'))) {
- $actionurl = (string)url('Statstore/showstore', ['type' => input('type'), 't' => $this->search_arr['t']]);
- $searchtime_arr_tmp = explode('|', $this->search_arr['t']);
- foreach ((array)$searchtime_arr_tmp as $k => $v) {
- $searchtime_arr[] = intval($v);
- }
- $where[] = array('store_addtime', 'between', $searchtime_arr);
- }
- //商品分类
- $storeclass_id = intval(input('scid'));
- if ($storeclass_id > 0) {
- $where[] = array('storeclass_id', '=', $storeclass_id);
- $actionurl .= "&scid=$storeclass_id";
- }
- //省份
- if (input('provid')) {
- $province_id = intval(input('param.provid'));
- $where[] = array('province_id', '=', $province_id);
- $actionurl .= "&provid=$province_id";
- }
- if (input('exporttype') == 'excel') {
- $store_list = $stat_model->getNewStoreStatList($where);
- } else {
- $store_list = $stat_model->getNewStoreStatList($where, '', 10);
- }
- //店铺等级
- $storegrade_model = model('storegrade');
- $grade_list = $storegrade_model->getStoregradeList();
- if (!empty($grade_list)) {
- $search_grade_list = array();
- foreach ($grade_list as $k => $v) {
- $search_grade_list[$v['storegrade_id']] = $v['storegrade_name'];
- }
- }
- //导出Excel
- if (input('exporttype') == 'excel') {
- //导出Excel
- $excel_obj = new \excel\Excel();
- $excel_data = array();
- //设置样式
- $excel_obj->setStyle(array('id' => 's_title', 'Font' => array('FontName' => '宋体', 'Size' => '12', 'Bold' => '1')));
- //header
- $excel_data[0][] = array('styleid' => 's_title', 'data' => lang('ds_store_name'));
- $excel_data[0][] = array('styleid' => 's_title', 'data' => lang('ds_member_name'));
- $excel_data[0][] = array('styleid' => 's_title', 'data' => lang('ds_seller_name'));
- $excel_data[0][] = array('styleid' => 's_title', 'data' => lang('stat_storedegree'));
- $excel_data[0][] = array('styleid' => 's_title', 'data' => lang('statstore_expire'));
- $excel_data[0][] = array('styleid' => 's_title', 'data' => lang('statstore_addtime'));
- //data
- foreach ($store_list as $k => $v) {
- $excel_data[$k + 1][] = array('data' => $v['store_name']);
- $excel_data[$k + 1][] = array('data' => $v['member_name']);
- $excel_data[$k + 1][] = array('data' => $v['seller_name']);
- $excel_data[$k + 1][] = array('data' => $search_grade_list[$v['grade_id']]);
- $excel_data[$k + 1][] = array('data' => $v['store_endtime'] ? date('Y-m-d', $v['store_endtime']) : lang('state_no_tile_limit'));
- $excel_data[$k + 1][] = array('data' => date('Y-m-d', $v['store_addtime']));
- }
- $excel_data = $excel_obj->charset($excel_data, CHARSET);
- $excel_obj->addArray($excel_data);
- $excel_obj->addWorksheet($excel_obj->charset(lang('ds_new') . lang('ds_store'), CHARSET));
- $excel_obj->generateXML($excel_obj->charset(lang('ds_new') . lang('ds_store'), CHARSET) . date('Y-m-d-H', TIMESTAMP));
- exit();
- }
- View::assign('search_grade_list', $search_grade_list);
- View::assign('actionurl', $actionurl);
- View::assign('store_list', $store_list);
- View::assign('show_page', $stat_model->page_info->render());
- $this->setAdminCurItem('showstore');
- return View::fetch('storelist');
- }
- /**
- * 销售统计
- */
- public function storesales()
- {
- if (!isset($this->search_arr['search_type'])) {
- $this->search_arr['search_type'] = 'day';
- }
- $stat_model = model('stat');
- //获得搜索的开始时间和结束时间
- $searchtime_arr = $stat_model->getStarttimeAndEndtime($this->search_arr);
- View::assign('searchtime', implode('|', $searchtime_arr));
- //周
- if (!input('param.search_time_year')) {
- $search_time_year = date('Y', TIMESTAMP);
- } else {
- $search_time_year = input('param.search_time_year');
- }
- if (!input('param.search_time_month')) {
- $search_time_month = date('m', TIMESTAMP);
- } else {
- $search_time_month = input('param.search_time_month');
- }
- if (!input('param.search_time_week')) {
- $search_time_week = implode('|', getWeek_SdateAndEdate(TIMESTAMP));
- } else {
- $search_time_week = input('param.search_time_week');
- }
- $current_year = $search_time_year;
- $current_month = $search_time_month;
- $current_week = $search_time_week;
- View::assign('current_year', $current_year);
- View::assign('current_month', $current_month);
- View::assign('current_week', $current_week);
- $this->setAdminCurItem('storesales');
- return View::fetch('stat_store_sales');
- }
- /**
- * 店铺销售统计列表
- */
- public function storesales_list()
- {
- $stat_model = model('stat');
- $searchtime_arr_tmp = explode('|', $this->search_arr['t']);
- foreach ((array)$searchtime_arr_tmp as $k => $v) {
- $searchtime_arr[] = intval($v);
- }
- $where = array();
- $where[] = array('order_isvalid', '=', 1); //计入统计的有效订单
- $where[] = array('order_add_time', 'between', $searchtime_arr);
- //店铺分类
- $search_sclass = intval(input('param.search_sclass'));
- if ($search_sclass) {
- $where[] = array('storeclass_id', '=', $search_sclass);
- }
- //店铺名称
- $where[] = array('store_name', 'like', "%" . input('param.search_sname') . "%");
- //查询总条数
- $count_arr = $stat_model->getoneByStatorder($where, 'COUNT(DISTINCT store_id) as countnum');
- $countnum = intval($count_arr['countnum']);
- //列表字段
- $field = " store_id,store_name,SUM(order_amount) as orderamount, COUNT(*) as ordernum, COUNT(DISTINCT buyer_id) as membernum";
- //排序
- $orderby_arr = array('membernum asc', 'membernum desc', 'ordernum asc', 'ordernum desc', 'orderamount asc', 'orderamount desc');
- if (!isset($this->search_arr['orderby']) || !in_array(trim($this->search_arr['orderby']), $orderby_arr)) {
- $this->search_arr['orderby'] = 'membernum desc';
- }
- $orderby = trim($this->search_arr['orderby']) . ',store_id asc';
- if (isset($this->search_arr['exporttype']) && $this->search_arr['exporttype'] == 'excel') {
- $statlist = $stat_model->statByStatorder($where, $field, 0, 0, $orderby, 'store_id');
- } else {
- $statlist = $stat_model->statByStatorder($where, $field, 20, 0, $orderby, 'store_id');
- foreach ((array)$statlist as $k => $v) {
- $v['view'] = "<a href='javascript:void(0);' ds_type='showtrends' data-param='{\"storeid\":\"{$v['store_id']}\"}'>走势图</a>";
- $statlist[$k] = $v;
- }
- }
- //列表header
- $statheader = array();
- $statheader[] = array('text' => lang('ds_store_name'), 'key' => 'store_name');
- $statheader[] = array('text' => lang('membernum'), 'key' => 'membernum', 'isorder' => 1);
- $statheader[] = array('text' => lang('statstore_ordernum'), 'key' => 'ordernum', 'isorder' => 1);
- $statheader[] = array('text' => lang('statstore_orderamount'), 'key' => 'orderamount', 'isorder' => 1);
- //导出Excel
- if (isset($this->search_arr['exporttype']) && $this->search_arr['exporttype'] == 'excel') {
- //导出Excel
- $excel_obj = new \excel\Excel();
- $excel_data = array();
- //设置样式
- $excel_obj->setStyle(array('id' => 's_title', 'Font' => array('FontName' => '宋体', 'Size' => '12', 'Bold' => '1')));
- //header
- foreach ($statheader as $k => $v) {
- $excel_data[0][] = array('styleid' => 's_title', 'data' => $v['text']);
- }
- //data
- foreach ($statlist as $k => $v) {
- foreach ($statheader as $h_k => $h_v) {
- $excel_data[$k + 1][] = array('data' => $v[$h_v['key']]);
- }
- }
- $excel_data = $excel_obj->charset($excel_data, CHARSET);
- $excel_obj->addArray($excel_data);
- $excel_obj->addWorksheet($excel_obj->charset(lang('store_sale_statis'), CHARSET));
- $excel_obj->generateXML($excel_obj->charset(lang('store_sale_statis'), CHARSET) . date('Y-m-d-H', TIMESTAMP));
- exit();
- }
- View::assign('statlist', $statlist);
- View::assign('statheader', $statheader);
- View::assign('orderby', $this->search_arr['orderby']);
- View::assign('actionurl', (string)url('Statstore/storesales_list', ['t' => $this->search_arr['t'], 'search_sclass' => $search_sclass, 'search_sname' => input('param.search_sname')]));
- View::assign('show_page', $stat_model->page_info->render());
- echo View::fetch('stat_listandorder');
- }
- /**
- * 销售走势
- */
- public function storesales_trends()
- {
- $storeid = intval(input('param.storeid'));
- if ($storeid <= 0) {
- View::assign('stat_error', lang('stat_error'));
- return View::fetch('salestrends');
- exit();
- }
- $search_type = input('param.search_type');
- if (!$search_type) {
- $search_type = 'day';
- }
- $stat_model = model('stat');
- $where = array();
- $where[] = array('store_id', '=', $storeid);
- $searchtime_arr_tmp = explode('|', $this->search_arr['t']);
- foreach ((array)$searchtime_arr_tmp as $k => $v) {
- $searchtime_arr[] = intval($v);
- }
- $where[] = array('order_isvalid', '=', 1); //计入统计的有效订单
- $where[] = array('order_add_time', 'between', $searchtime_arr);
- $field = " store_id,store_name,SUM(order_amount) as orderamount, COUNT(*) as ordernum, COUNT(DISTINCT buyer_id) as membernum";
- $stat_arr = array('orderamount' => array(), 'ordernum' => array(), 'membernum' => array());
- $statlist = array();
- if ($search_type == 'day') {
- //构造横轴数据
- for ($i = 0; $i < 24; $i++) {
- //横轴
- foreach ($stat_arr as $k => $v) {
- $stat_arr[$k]['xAxis']['categories'][] = "$i";
- $statlist[$k][$i] = 0;
- }
- }
- $field .= ' ,HOUR(FROM_UNIXTIME(order_add_time)) as timeval ';
- }
- if ($search_type == 'week') {
- //构造横轴数据
- for ($i = 1; $i <= 7; $i++) {
- $tmp_weekarr = getSystemWeekArr();
- //横轴
- foreach ($stat_arr as $k => $v) {
- $stat_arr[$k]['xAxis']['categories'][] = $tmp_weekarr[$i];
- $statlist[$k][$i] = 0;
- }
- unset($tmp_weekarr);
- }
- $field .= ' ,WEEKDAY(FROM_UNIXTIME(order_add_time))+1 as timeval ';
- }
- if ($search_type == 'month') {
- //计算横轴的最大量(由于每个月的天数不同)
- $dayofmonth = date('t', $searchtime_arr[0]);
- //构造横轴数据
- for ($i = 1; $i <= $dayofmonth; $i++) {
- //横轴
- foreach ($stat_arr as $k => $v) {
- $stat_arr[$k]['xAxis']['categories'][] = $i;
- $statlist[$k][$i] = 0;
- }
- }
- $field .= ' ,day(FROM_UNIXTIME(order_add_time)) as timeval ';
- }
- //查询数据
- $statlist_tmp = $stat_model->statByStatorder($where, $field, 0, '');
- //整理统计数组
- $storename = '';
- if ($statlist_tmp) {
- foreach ($statlist_tmp as $k => $v) {
- $storename = $v['store_name'];
- foreach ($stat_arr as $t_k => $t_v) {
- if ($k == 'orderamount') {
- $statlist[$t_k][$v['timeval']] = round($v[$t_k], 2);
- } else {
- $statlist[$t_k][$v['timeval']] = intval($v[$t_k]);
- }
- }
- }
- }
- foreach ($stat_arr as $k => $v) {
- $stat_arr[$k]['legend']['enabled'] = false;
- switch ($k) {
- case 'orderamount':
- $caption = lang('statstore_orderamount');
- break;
- case 'ordernum':
- $caption = lang('statstore_ordernum');
- break;
- default:
- $caption = lang('membernum');
- break;
- }
- $stat_arr[$k]['series'][0]['name'] = $caption;
- $stat_arr[$k]['series'][0]['data'] = array_values($statlist[$k]);
- $stat_arr[$k]['title'] = $caption . lang('sale_trend');
- $stat_arr[$k]['yAxis'] = $caption;
- //得到统计图数据
- $stat_json[$k] = getStatData_LineLabels($stat_arr[$k]);
- }
- View::assign('storename', $storename);
- View::assign('stat_json', $stat_json);
- echo View::fetch('store_salestrends');
- }
- /**
- * 地区分布
- */
- public function storearea()
- {
- $stat_model = model('stat');
- //获得搜索的开始时间和结束时间
- $searchtime_arr = $stat_model->getStarttimeAndEndtime($this->search_arr);
- $where = array();
- if (trim(input('param.search_time'))) {
- $where[] = array('store_addtime', '<=', strtotime(input('param.search_time')));
- }
- $search_sclass = intval(input('param.search_sclass'));
- if ($search_sclass > 0) {
- $where[] = array('storeclass_id', '=', $search_sclass);
- }
- $field = ' region_id, COUNT(*) as storenum ';
- $statlist_tmp = $stat_model->statByStore($where, $field, 'region_id', 'region_id');
- // 地区
- $province_array = model('area')->getTopLevelAreas();
- //地图显示等级数组
- $level_arr = array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9), array(10, 11, 12));
- $statlist = array();
- $temp_list = array();
- foreach ((array)$statlist_tmp as $k => $v) {
- $v['level'] = 4; //排名
- foreach ($level_arr as $lk => $lv) {
- if (in_array($k + 1, $lv)) {
- $v['level'] = $lk; //排名
- }
- }
- //获取该地区的省
- if ($v['region_id']) {
- if (!isset($temp_list[$v['region_id']])) {
- $temp = Db::name('area')->where('area_id=' . $v['region_id'])->value('area_parent_id');
- if ($temp) {
- $temp_list[$v['region_id']] = $temp;
- } else {
- $temp_list[$v['region_id']] = $v['region_id'];
- }
- $index = 0;
- while ($temp && $index < 4) {
- $temp_list[$v['region_id']] = $temp;
- $temp_0 = $temp;
- $temp = Db::name('area')->where('area_id=' . $temp)->value('area_parent_id');
- if ($temp) {
- $temp_list[$temp_0] = $temp;
- } else {
- $temp_list[$temp_0] = $temp_0;
- }
- $index++;
- }
- }
- $province_id = $temp_list[$v['region_id']];
- } else {
- $province_id = 0;
- }
- $v['sort'] = $k + 1;
- $v['provincename'] = isset($province_array[$province_id]) ? $province_array[$province_id] : lang('other');
- if (!isset($statlist[$province_id])) {
- $statlist[$province_id] = $v;
- } else {
- $statlist[$province_id]['storenum'] += $v['storenum'];
- }
- }
- $stat_arr = array();
- foreach ((array)$province_array as $k => $v) {
- if (isset($statlist[$k])) {
- $stat_arr[] = array('cha' => $k, 'name' => $v, 'des' => ",店铺量:{$statlist[$k]['storenum']}", 'level' => $statlist[$k]['level']);
- } else {
- $stat_arr[] = array('cha' => $k, 'name' => $v, 'des' => ',无订单数据', 'level' => 4);
- }
- }
- $stat_json = getStatData_Map($stat_arr);
- View::assign('stat_json', $stat_json);
- View::assign('statlist', $statlist);
- $actionurl = (string)url('Statstore/storearea');
- if (trim(input('param.search_time'))) {
- $actionurl = $actionurl . '&t=0|' . strtotime(input('param.search_time'));
- }
- if ($search_sclass > 0) {
- $actionurl .= "&scid=$search_sclass";
- }
- View::assign('actionurl', $actionurl);
- $this->setAdminCurItem('storearea');
- return View::fetch('stat_storearea');
- }
- protected function getAdminItemList()
- {
- $menu_array = array(
- array('name' => 'newstore', 'text' => lang('stat_newstore'), 'url' => (string)url('Statstore/newstore')),
- array('name' => 'hotrank', 'text' => lang('stat_storehotrank'), 'url' => (string)url('Statstore/hotrank')),
- array('name' => 'storesales', 'text' => lang('stat_storesales'), 'url' => (string)url('Statstore/storesales')),
- array('name' => 'degree', 'text' => lang('stat_storedegree'), 'url' => (string)url('Statstore/degree')),
- array('name' => 'storearea', 'text' => lang('stat_storearea'), 'url' => (string)url('Statstore/storearea')),
- );
- return $menu_array;
- }
- }
|