<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace app\shop\controller;
use app\model\stat\GoodsStat;
use app\model\system\Stat as StatModel;
use app\shop\service\StatExportService;
use Carbon\Carbon;
/**
* 数据统计
* Class Stat
* @package app\shop\controller
*/
class Stat extends BaseShop
{
/**
* 店铺统计
* @return mixed
*/
public function shop()
{
$this->assign('today', Carbon::today()->toDateString());
$this->assign('yesterday', Carbon::yesterday()->toDateString());
return $this->fetch('stat/shop');
}
/**
* 获取时间段内统计数据总和
*/
public function getStatTotal()
{
$start_time = input('start_time', strtotime(date('Y-m-d', time())));
$end_time = input('end_time', time());
if ($start_time > $end_time) {
$start_time = input('end_time');
$end_time = input('start_time');
}
if (request()->isJson()) {
$stat_model = new StatModel();
$data = $stat_model->getShopStatSum($this->site_id, $start_time, $end_time);
return $data;
}
//导出
$is_export = input('is_export');
$selected_type = input('selected_type');
$export_type = input('export_type');
if ($is_export) {
$stat_model = new StatModel();
$data = $stat_model->getShopStatSum($this->site_id, $start_time, $end_time)['data'];
// $phpExcel = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
[$phpExcel,$export_type_text] = (new StatExportService())->main($export_type,$data,$this->site_id,$start_time,$end_time);
$selected_type_text = '今日';
switch ($selected_type){
case 'today':
$selected_type_text = '今日';
break;
case 'yesterday':
$selected_type_text = '昨日';
break;
case 'seven':
$selected_type_text = '7日内';
break;
case 'thirty':
$selected_type_text = '30日内';
break;
case 'custom':
$selected_type_text = date('Y-m-d',$start_time).'至'.date('Y-m-d',$end_time);
break;
}
$excel_text = $selected_type_text . $export_type_text;
$phpExcel->setActiveSheetIndex(0);
$objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($phpExcel, 'Xlsx');
$file = "$excel_text.xlsx";
$objWriter->save($file);
header('Content-type:application/octet-stream');
$filename = basename($file);
header('Content-Disposition:attachment;filename = ' . $filename);
header('Accept-ranges:bytes');
header('Accept-length:' . filesize($file));
readfile($file);
unlink($file);
}
}
/**
* 获取天统计趋势数据
*/
public function getStatData()
{
if (request()->isJson()) {
$start_time = input('start_time', strtotime(date('Y-m-d', strtotime('-6 day'))));
$end_time = input('end_time', time());
if ($start_time > $end_time) {
$start_time = input('end_time');
$end_time = input('start_time');
}
$stat_model = new StatModel();
$fields = $stat_model->getStatField();
$fields[] = 'cashier_order_pay_money';
$stat_list = $stat_model->getShopStatList($this->site_id, $start_time, $end_time)[ 'data' ];
$stat_list = array_map(function($item) {
$item[ 'day_time' ] = date('Y-m-d', $item[ 'day_time' ]);
return $item;
}, $stat_list);
$stat_list = array_column($stat_list, null, 'day_time');
$day = ceil(( $end_time - $start_time ) / 86400);
foreach ($fields as $field) {
$value = [];
$time = [];
for ($i = 0; $i < $day; $i++) {
$date = date('Y-m-d', $start_time + $i * 86400);
$time[] = $date;
$value[] = isset($stat_list[ $date ]) && isset($stat_list[ $date ][ $field ]) ? $stat_list[ $date ][ $field ] : 0;
}
$data[ $field ] = $value;
$data[ 'time' ] = $time;
}
return $data;
}
}
/**
* 获取小时统计趋势数据
*/
public function getStatHourData()
{
if (request()->isJson()) {
$time = input('start_time', time());
$carbon = Carbon::createFromTimestamp($time);
$stat_model = new StatModel();
$fields = $stat_model->getStatHourField();
$fields[] = 'cashier_order_pay_money';
$stat_list = $stat_model->getShopStatHourList($this->site_id, $carbon->year, $carbon->month, $carbon->day)[ 'data' ];
$data = [];
$empty = array_map(function() { return 0; }, range(0, 23, 1));
if (!empty($stat_list)) {
$stat_list = array_column($stat_list, null, 'hour');
foreach ($fields as $field) {
$value = [];
for ($i = 0; $i < 24; $i++) {
$value[ $i ] = isset($stat_list[ $i ]) && isset($stat_list[ $i ][ $field ]) ? $stat_list[ $i ][ $field ] : 0;
}
$data[ $field ] = $value;
}
} else {
foreach ($fields as $field) {
$data[ $field ] = $empty;
}
}
$data[ 'time' ] = array_map(function($value) { return $value . '时'; }, range(0, 23, 1));
return $data;
}
}
/**
* 商品统计
* @return mixed
*/
public function goods()
{
$this->assign('today', Carbon::today()->toDateString());
$this->assign('yesterday', Carbon::yesterday()->toDateString());
return $this->fetch('stat/goods');
}
/**
* 交易统计
* @return mixed
*/
public function order()
{
$this->assign('today', Carbon::today()->toDateString());
$this->assign('yesterday', Carbon::yesterday()->toDateString());
return $this->fetch('stat/order');
}
/**
* 访问统计
* @return mixed
*/
public function visit()
{
$this->assign('today', Carbon::today()->toDateString());
$this->assign('yesterday', Carbon::yesterday()->toDateString());
$stat_shop_model = new \app\model\system\Stat();
$today = Carbon::now();
$yesterday = Carbon::yesterday();
$stat_today = $stat_shop_model->getStatShop($this->site_id, $today->year, $today->month, $today->day)[ 'data' ];
$stat_yesterday = $stat_shop_model->getStatShop($this->site_id, $yesterday->year, $yesterday->month, $yesterday->day)[ 'data' ];
$stat_today[ 'conversion_ratio' ] = $stat_today[ 'visit_count' ] > 0 ? round($stat_today[ 'order_member_count' ] / $stat_today[ 'visit_count' ], 2) : 0;
$stat_yesterday[ 'conversion_ratio' ] = $stat_yesterday[ 'visit_count' ] > 0 ? round($stat_yesterday[ 'order_member_count' ] / $stat_yesterday[ 'visit_count' ], 2) : 0;
$this->assign('stat_today', $stat_today);
$this->assign('stat_yesterday', $stat_yesterday);
$day_rate = [];
$day_rate[ 'order_member_count' ] = diff_rate($stat_today[ 'order_member_count' ], $stat_yesterday[ 'order_member_count' ]);
$day_rate[ 'visit_count' ] = diff_rate($stat_today[ 'visit_count' ], $stat_yesterday[ 'visit_count' ]);
$day_rate[ 'member_count' ] = diff_rate($stat_today[ 'member_count' ], $stat_yesterday[ 'member_count' ]);
$day_rate[ 'conversion_ratio' ] = diff_rate($stat_today[ 'conversion_ratio' ], $stat_yesterday[ 'conversion_ratio' ]);
$this->assign('day_rate', $day_rate);
return $this->fetch('stat/visit');
}
/**
* 会员统计
* @return mixed
*/
public function member()
{
$this->assign('today', Carbon::today()->toDateString());
$this->assign('yesterday', Carbon::yesterday()->toDateString());
return $this->fetch('stat/member');
}
/**
* 商品排行榜 销量
* */
public function countGoodsSale()
{
if (request()->isJson()) {
$start_time = input('start_time', '');
$end_time = input('end_time', '');
$page_index = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$stat_model = new StatModel();
$res = $stat_model->getGoodsSaleNumRankingList($this->site_id, $start_time, $end_time, $page_index, $page_size);
return $res;
}
}
/**
* 商品排行榜 销售额
* */
public function countGoodsSaleMoney()
{
if (request()->isJson()) {
$start_time = input('start_time', '');
$end_time = input('end_time', '');
$page_index = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$stat_model = new StatModel();
$res = $stat_model->getGoodsSaleMoneyRankingList($this->site_id, $start_time, $end_time, $page_index, $page_size);
return $res;
}
}
/**
* 销售额排行
* @return array
*/
public function getGoodsOrderMoneyStat(){
$goods_stat_model = new GoodsStat();
$params = array(
'site_id' => $this->site_id,
'start_time' => input('start_time', 0),
'end_time'=> input('end_time', 0),
'limit' => input('limit', 5)
);
$result = $goods_stat_model->getGoodsOrderMoneyStat($params);
return $result;
}
/**
* 销售量排行
* @return array
*/
public function getGoodsOrderNumStat(){
$goods_stat_model = new GoodsStat();
$params = array(
'site_id' => $this->site_id,
'start_time' => input('start_time', 0),
'end_time'=> input('end_time', 0),
'limit' => input('limit', 5)
);
$result = $goods_stat_model->getGoodsOrderNumStat($params);
return $result;
}
}