258 lines
8.7 KiB
PHP
258 lines
8.7 KiB
PHP
<?php
|
|
/**
|
|
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
|
|
* =========================================================
|
|
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
|
|
* ----------------------------------------------
|
|
* 官方网址: https://www.gobuysaas.com
|
|
* =========================================================
|
|
*/
|
|
|
|
namespace app\shop\controller;
|
|
|
|
use app\model\stat\GoodsStat;
|
|
use app\model\system\Stat as StatModel;
|
|
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()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$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');
|
|
}
|
|
|
|
$stat_model = new StatModel();
|
|
$data = $stat_model->getShopStatSum($this->site_id, $start_time, $end_time);
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取天统计趋势数据
|
|
*/
|
|
public function getStatData()
|
|
{
|
|
if (request()->isAjax()) {
|
|
$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()->isAjax()) {
|
|
$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()->isAjax()) {
|
|
$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()->isAjax()) {
|
|
$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;
|
|
}
|
|
} |