admin/addon/store/shopapi/controller/Stat.php

1640 lines
76 KiB
PHP

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
* =========================================================
*/
namespace addon\store\shopapi\controller;
use addon\store\model\stat\SiteStat as SiteStatModel;
use app\model\order\OrderCommon as OrderCommonModel;
use addon\store\model\stat\SiteStat;
use app\siteapi\controller\BaseSiteApi;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
/**
* 数据统计
* Class Stat
* @package addon\shop\siteapi\controller
*/
class Stat extends BaseStoreApi
{
/**
* 店铺统计
* @return mixed
*/
public function shop()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 0;
if ($date_type == 0) {
$start_time = strtotime("today");
$time_range = date('Y-m-d', $start_time);
} else if ($date_type == 1) {
$start_time = strtotime(date('Y-m-d', strtotime("-6 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
} else if ($date_type == 2) {
$start_time = strtotime(date('Y-m-d', strtotime("-29 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
}
$stat_model = new SiteStatModel($this->site_id);
$shop_stat_sum = $stat_model->getShopStatSum($this->site_id, $start_time);
$shop_stat_sum['data']['time_range'] = $time_range;
return $this->response($shop_stat_sum);
}
/**
* 店铺统计报表
* */
public function getShopStatList()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 1;
if ($date_type == 1) {
$start_time = strtotime(date('Y-m-d', strtotime("-6 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 6;
} else if ($date_type == 2) {
$start_time = strtotime(date('Y-m-d', strtotime("-29 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 29;
}
$stat_model = new SiteStatModel($this->site_id);
$stat_list = $stat_model->getShopStatList($this->site_id, $start_time);
//将时间戳作为列表的主键
$shop_stat_list = array_column($stat_list['data'], null, 'day_time');
$data = array();
for ($i = 0; $i <= $day; $i++) {
$time = strtotime(date('Y-m-d', strtotime("-" . ($day - $i) . " day")));
$data['time'][$i] = date('Y-m-d', $time);
if (array_key_exists($time, $shop_stat_list)) {
$data['order_total'][$i] = $shop_stat_list[$time]['order_total'];
$data['shipping_total'][$i] = $shop_stat_list[$time]['shipping_total'];
$data['refund_total'][$i] = $shop_stat_list[$time]['refund_total'];
$data['order_pay_count'][$i] = $shop_stat_list[$time]['order_pay_count'];
$data['goods_pay_count'][$i] = $shop_stat_list[$time]['goods_pay_count'];
$data['shop_money'][$i] = $shop_stat_list[$time]['shop_money'];
$data['platform_money'][$i] = $shop_stat_list[$time]['platform_money'];
$data['collect_shop'][$i] = $shop_stat_list[$time]['collect_shop'];
$data['collect_goods'][$i] = $shop_stat_list[$time]['collect_goods'];
$data['visit_count'][$i] = $shop_stat_list[$time]['visit_count'];
$data['order_count'][$i] = $shop_stat_list[$time]['order_count'];
$data['goods_count'][$i] = $shop_stat_list[$time]['goods_count'];
$data['add_goods_count'][$i] = $shop_stat_list[$time]['add_goods_count'];
$data['member_count'][$i] = $shop_stat_list[$time]['member_count'];
} else {
$data['order_total'][$i] = 0.00;
$data['shipping_total'][$i] = 0.00;
$data['refund_total'][$i] = 0.00;
$data['order_pay_count'][$i] = 0;
$data['goods_pay_count'][$i] = 0;
$data['shop_money'][$i] = 0.00;
$data['platform_money'][$i] = 0.00;
$data['collect_shop'][$i] = 0;
$data['collect_goods'][$i] = 0;
$data['visit_count'][$i] = 0;
$data['order_count'][$i] = 0;
$data['goods_count'][$i] = 0;
$data['add_goods_count'][$i] = 0;
$data['member_count'][$i] = 0;
}
}
$data['time_range'] = $time_range;
return $this->response($this->success($data));
}
/**
* 商品统计
* @return mixed
*/
public function goods()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 0;
if ($date_type == 0) {
$start_time = strtotime("today");
$time_range = date('Y-m-d', $start_time);
} else if ($date_type == 1) {
$start_time = strtotime("-6 day");
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
} else if ($date_type == 2) {
$start_time = strtotime("-29 day");
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
}
$stat_model = new SiteStatModel($this->site_id);
$shop_stat_sum = $stat_model->getShopStatSum($this->site_id, $start_time);
$shop_stat_sum['data']['time_range'] = $time_range;
return $this->response($shop_stat_sum);
}
/**
* 商品统计报表
* */
public function getGoodsStatList()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 1;
if ($date_type == 1) {
$start_time = strtotime("-6 day");
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 6;
} else if ($date_type == 2) {
$start_time = strtotime("-29 day");
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 29;
}
$stat_model = new SiteStatModel($this->site_id);
$stat_list = $stat_model->getShopStatList($this->site_id, $start_time);
//将时间戳作为列表的主键
$shop_stat_list = array_column($stat_list['data'], null, 'day_time');
$data = array();
for ($i = 0; $i <= $day; $i++) {
$time = strtotime(date('Y-m-d', strtotime("-" . ($day - $i) . " day")));
$data['time'][$i] = date('Y-m-d', $time);
if (array_key_exists($time, $shop_stat_list)) {
$data['order_total'][$i] = $shop_stat_list[$time]['order_total'];
$data['shipping_total'][$i] = $shop_stat_list[$time]['shipping_total'];
$data['refund_total'][$i] = $shop_stat_list[$time]['refund_total'];
$data['order_pay_count'][$i] = $shop_stat_list[$time]['order_pay_count'];
$data['goods_pay_count'][$i] = $shop_stat_list[$time]['goods_pay_count'];
$data['shop_money'][$i] = $shop_stat_list[$time]['shop_money'];
$data['platform_money'][$i] = $shop_stat_list[$time]['platform_money'];
$data['collect_shop'][$i] = $shop_stat_list[$time]['collect_shop'];
$data['collect_goods'][$i] = $shop_stat_list[$time]['collect_goods'];
$data['visit_count'][$i] = $shop_stat_list[$time]['visit_count'];
$data['order_count'][$i] = $shop_stat_list[$time]['order_count'];
$data['goods_count'][$i] = $shop_stat_list[$time]['goods_count'];
$data['add_goods_count'][$i] = $shop_stat_list[$time]['add_goods_count'];
$data['member_count'][$i] = $shop_stat_list[$time]['member_count'];
} else {
$data['order_total'][$i] = 0.00;
$data['shipping_total'][$i] = 0.00;
$data['refund_total'][$i] = 0.00;
$data['order_pay_count'][$i] = 0;
$data['goods_pay_count'][$i] = 0;
$data['shop_money'][$i] = 0.00;
$data['platform_money'][$i] = 0.00;
$data['collect_shop'][$i] = 0;
$data['collect_goods'][$i] = 0;
$data['visit_count'][$i] = 0;
$data['order_count'][$i] = 0;
$data['goods_count'][$i] = 0;
$data['add_goods_count'][$i] = 0;
$data['member_count'][$i] = 0;
}
}
$data['time_range'] = $time_range;
return $this->response($this->success($data));
}
/**
* 交易统计
* @return mixed
*/
public function order()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 0;
if ($date_type == 0) {
$start_time = strtotime("today");
$time_range = date('Y-m-d', $start_time);
} else if ($date_type == 1) {
$start_time = strtotime(date('Y-m-d', strtotime("-6 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
} else if ($date_type == 2) {
$start_time = strtotime(date('Y-m-d', strtotime("-29 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
}
$stat_model = new SiteStatModel($this->site_id);
$shop_stat_sum = $stat_model->getShopStatSum($this->site_id, $start_time);
$shop_stat_sum['data']['time_range'] = $time_range;
return $this->response($shop_stat_sum);
}
/**
* 交易统计报表
* */
public function getOrderStatList()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 1;
if ($date_type == 1) {
$start_time = strtotime(date('Y-m-d', strtotime("-6 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 6;
} else if ($date_type == 2) {
$start_time = strtotime(date('Y-m-d', strtotime("-29 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 29;
}
$stat_model = new SiteStatModel($this->site_id);
$stat_list = $stat_model->getShopStatList($this->site_id, $start_time);
//将时间戳作为列表的主键
$shop_stat_list = array_column($stat_list['data'], null, 'day_time');
$data = array();
for ($i = 0; $i <= $day; $i++) {
$time = strtotime(date('Y-m-d', strtotime("-" . ($day - $i) . " day")));
$data['time'][$i] = date('Y-m-d', $time);
if (array_key_exists($time, $shop_stat_list)) {
$data['order_total'][$i] = $shop_stat_list[$time]['order_total'];
$data['shipping_total'][$i] = $shop_stat_list[$time]['shipping_total'];
$data['refund_total'][$i] = $shop_stat_list[$time]['refund_total'];
$data['order_pay_count'][$i] = $shop_stat_list[$time]['order_pay_count'];
$data['goods_pay_count'][$i] = $shop_stat_list[$time]['goods_pay_count'];
$data['shop_money'][$i] = $shop_stat_list[$time]['shop_money'];
$data['platform_money'][$i] = $shop_stat_list[$time]['platform_money'];
$data['collect_shop'][$i] = $shop_stat_list[$time]['collect_shop'];
$data['collect_goods'][$i] = $shop_stat_list[$time]['collect_goods'];
$data['visit_count'][$i] = $shop_stat_list[$time]['visit_count'];
$data['order_count'][$i] = $shop_stat_list[$time]['order_count'];
$data['goods_count'][$i] = $shop_stat_list[$time]['goods_count'];
$data['add_goods_count'][$i] = $shop_stat_list[$time]['add_goods_count'];
} else {
$data['order_total'][$i] = 0.00;
$data['shipping_total'][$i] = 0.00;
$data['refund_total'][$i] = 0.00;
$data['order_pay_count'][$i] = 0;
$data['goods_pay_count'][$i] = 0;
$data['shop_money'][$i] = 0.00;
$data['platform_money'][$i] = 0.00;
$data['collect_shop'][$i] = 0;
$data['collect_goods'][$i] = 0;
$data['visit_count'][$i] = 0;
$data['order_count'][$i] = 0;
$data['goods_count'][$i] = 0;
$data['add_goods_count'][$i] = 0;
}
}
$data['time_range'] = $time_range;
return $this->response($this->success($data));
}
/**
* 访问统计
* @return mixed
*/
public function visit()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 0;
if ($date_type == 0) {
$start_time = strtotime("today");
$time_range = date('Y-m-d', $start_time);
} else if ($date_type == 1) {
$start_time = strtotime(date('Y-m-d', strtotime("-6 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
} else if ($date_type == 2) {
$start_time = strtotime(date('Y-m-d', strtotime("-29 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
}
$stat_model = new SiteStatModel($this->site_id);
$shop_stat_sum = $stat_model->getShopStatSum($this->site_id, $start_time);
$shop_stat_sum['data']['time_range'] = $time_range;
return $this->response($shop_stat_sum);
}
/**
* 访问统计报表
* */
public function getVisitStatList()
{
$date_type = isset($this->params['date_type']) ? $this->params['date_type'] : 1;
if ($date_type == 1) {
$start_time = strtotime(date('Y-m-d', strtotime("-6 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 6;
} else if ($date_type == 2) {
$start_time = strtotime(date('Y-m-d', strtotime("-29 day")));
$time_range = date('Y-m-d', $start_time) . ' 至 ' . date('Y-m-d', strtotime("today"));
$day = 29;
}
$stat_model = new SiteStatModel($this->site_id);
$stat_list = $stat_model->getShopStatList($this->site_id, $start_time);
//将时间戳作为列表的主键
$shop_stat_list = array_column($stat_list['data'], null, 'day_time');
$data = array();
for ($i = 0; $i <= $day; $i++) {
$time = strtotime(date('Y-m-d', strtotime("-" . ($day - $i) . " day")));
$data['time'][$i] = date('Y-m-d', $time);
if (array_key_exists($time, $shop_stat_list)) {
$data['order_total'][$i] = $shop_stat_list[$time]['order_total'];
$data['shipping_total'][$i] = $shop_stat_list[$time]['shipping_total'];
$data['refund_total'][$i] = $shop_stat_list[$time]['refund_total'];
$data['order_pay_count'][$i] = $shop_stat_list[$time]['order_pay_count'];
$data['goods_pay_count'][$i] = $shop_stat_list[$time]['goods_pay_count'];
$data['shop_money'][$i] = $shop_stat_list[$time]['shop_money'];
$data['platform_money'][$i] = $shop_stat_list[$time]['platform_money'];
$data['collect_shop'][$i] = $shop_stat_list[$time]['collect_shop'];
$data['collect_goods'][$i] = $shop_stat_list[$time]['collect_goods'];
$data['visit_count'][$i] = $shop_stat_list[$time]['visit_count'];
$data['order_count'][$i] = $shop_stat_list[$time]['order_count'];
$data['goods_count'][$i] = $shop_stat_list[$time]['goods_count'];
$data['add_goods_count'][$i] = $shop_stat_list[$time]['add_goods_count'];
} else {
$data['order_total'][$i] = 0.00;
$data['shipping_total'][$i] = 0.00;
$data['refund_total'][$i] = 0.00;
$data['order_pay_count'][$i] = 0;
$data['goods_pay_count'][$i] = 0;
$data['shop_money'][$i] = 0.00;
$data['platform_money'][$i] = 0.00;
$data['collect_shop'][$i] = 0;
$data['collect_goods'][$i] = 0;
$data['visit_count'][$i] = 0;
$data['order_count'][$i] = 0;
$data['goods_count'][$i] = 0;
$data['add_goods_count'][$i] = 0;
}
}
$data['time_range'] = $time_range;
return $this->response($this->success($data));
}
/**
* 财务报表
* @return array
*/
public function financeStat()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$store_id = $this->store_id;
$start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
$stat_config = event('SiteStatType', [ 'site_type' => $this->app_module ], true);
$income = array_filter(array_column($stat_config, 'stat_type', 'key'));
$income_arr = [];
foreach ($income as $k => $v) {
$income_arr[ $v ][] = [
'value' => '0.00',
'type' => $k,
'pc_url' => $stat_config[ $k ][ 'pc_url' ] ?? '',
'desc' => $stat_config[ $k ][ 'desc' ] ?? '',
'title' => $stat_config[ $k ][ 'title' ] ?? '',
'is_calc' => $stat_config[ $k ][ 'is_calc' ] ?? '0',
];
}
$total_income = 0;//总收入
$total_expenditure = 0;//总支出
$stat_shop_model = new SiteStatModel($this->site_id);
$field = '';
foreach ($income as $k => $v) {
$day_field = $stat_config[ $k ][ 'day_data' ];
$field .= 'sum(' . $day_field . ') as ' . $k . ',';
}
$field = trim($field, ',');
$stat_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $start_time, $end_time, $store_id)[ 'data' ] ?? [];
foreach ($income_arr as $key => $item) {
foreach ($item as $k => $v) {
$income_arr[ $key ][ $k ][ 'value' ] = number_format($stat_info[ $v[ 'type' ] ], 2, '.', '');
if ($key == 'income' && $v[ 'is_calc' ]) $total_income += $stat_info[ $v[ 'type' ] ];
if ($key == 'expenditure' && $v[ 'is_calc' ]) $total_expenditure += $stat_info[ $v[ 'type' ] ];
}
}
$return_data = [
'account' => number_format($total_income - $total_expenditure, 2, '.', ''),
'total_income' => number_format($total_income, 2, '.', ''),
'total_expenditure' => number_format($total_expenditure, 2, '.', ''),
'income' => $income_arr[ 'income' ],
'expenditure' => $income_arr[ 'expenditure' ],
'time' => date('Y-m-d H:i:s')
];
return $this->response($this->success($return_data));
}
/**
* 经营概况
*/
public function indexStat()
{
$store_id = $this->store_id;
//基础统计信息
$today = Carbon::now();
$stat_shop_model = new SiteStatModel($this->site_id);
$yesterday = Carbon::yesterday();
$field_arr = [
'service_order_money',//服务订单金额
'order_money',//零售订单金额
'timecard_order_money',//卡项订单金额
'recharge_order_money',//充值订单金额
'member_count',//客户总数
'use_balance_money',//储值消费
'recharge_member',//储值会员数
'level_member_num',//会员数量(拥有等级)
'refund_money',//退款
];
$stat_config = event('SiteStatType', [ 'site_type' => $this->app_module ], true);
$field = '';
foreach ($field_arr as $k => $v) {
$day_field = $stat_config[$v]['day_data'];
$field .= 'sum(' . $day_field . ') as ' . $stat_config[$v]['day_data'] . ',';
$field .= 'sum(' . $stat_config[$v]['total_data'] . ') as ' . $stat_config[$v]['total_data'] . ',';
}
$field = trim($field, ',');
//昨日
$yesterday_info = $stat_shop_model->getStatSite($this->site_id, $yesterday->year, $yesterday->month, $yesterday->day, $field, $store_id)[ 'data' ] ?? [];
//今日
$today_info = $stat_shop_model->getStatSite($this->site_id, $today->year, $today->month, $today->day, $field, $store_id)[ 'data' ] ?? [];
//本月
$begin_month = mktime(0,0,0,date('m'),1,date('Y'));
$end_month = mktime(23,59,59,date('m'),date('t'),date('Y'));
$month_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $begin_month, $end_month, $store_id)[ 'data' ] ?? [];
foreach ($field_arr as $k => $v){
$yesterday_data[$stat_config[$v]['day_data']] = $yesterday_info[$stat_config[$v]['day_data']] ?? 0;
//昨日收入总额
if($stat_config[$v]['stat_type'] == 'income'){
$yesterday_data['total_money'] = $yesterday_data['total_money'] ?? 0;
$yesterday_data['total_money'] += $yesterday_info[$stat_config[$v]['day_data']];
$yesterday_data['total_money'] = number_format($yesterday_data['total_money'], 2, '.', '');
}
$today_data[$stat_config[$v]['day_data']] = $today_info[$stat_config[$v]['day_data']] ?? 0;
if($stat_config[$v]['stat_type'] == 'income'){
$today_data['total_money'] = $today_data['total_money'] ?? 0;
$today_data['total_money'] += $today_info[$stat_config[$v]['day_data']];
$today_data['total_money'] = number_format($today_data['total_money'], 2, '.', '');
}
$total_data[$stat_config[$v]['day_data']] = $today_info[$stat_config[$v]['total_data']] ?? 0;
if($stat_config[$v]['stat_type'] == 'income'){
$total_data['total_money'] = $total_data['total_money'] ?? 0;
$total_data['total_money'] += $today_info[$stat_config[$v]['total_data']];
$total_data['total_money'] = number_format($total_data['total_money'], 2, '.', '');
}
$desc_data[$stat_config[$v]['day_data']] = $stat_config[$v]['desc'];
if($stat_config[$v]['stat_type'] == 'income'){
$desc_data['total_money'] = isset($desc_data['total_money']) ? $desc_data['total_money'].' + ' : '店铺收入 = ';
$desc_data['total_money'] .= $stat_config[$v]['title'];
}
$month_data[$stat_config[$v]['day_data']] = $month_info[$stat_config[$v]['day_data']] ?? 0;
if($stat_config[$v]['stat_type'] == 'income'){
$month_data['total_money'] = $month_data['total_money'] ?? '0.00';
$month_data['total_money'] += $month_info[$stat_config[$v]['day_data']];
$month_data['total_money'] = number_format($month_data['total_money'], 2, '.', '');
}
}
$data = [
'yesterday_data' => $yesterday_data,
'today_data' => $today_data,
'total_data' => $total_data,
'month_data' => $month_data,
'desc' => $desc_data,
'time' => date('Y-m-d H:i:s')
];
return $this->response($this->success($data));
}
/********************************************************* 营业数据 ***************************************************************/
public function businessDataStat()
{
$type = isset($this->params['type']) ? $this->params['type'] : 'today';
$store_id = $this->store_id;
$stat_shop_model = new SiteStatModel($this->site_id);
$present = Carbon::now();
switch ( $type ) {
case 'today':
$yesterday = Carbon::yesterday();
$begain_start_time = $yesterday->startOfDay()->timestamp;
$begain_end_time = $yesterday->endOfDay()->timestamp;
$last_start_time = $present->startOfDay()->timestamp;
$last_end_time = $present->endOfDay()->timestamp;
break;
case 'yesterday':
$yesterday = Carbon::yesterday();
$begain_start_time = $yesterday->startOfDay()->timestamp;
$begain_end_time = $yesterday->endOfDay()->timestamp;
$last_start_time = $present->subDays(1)->startOfDay()->timestamp;
$last_end_time = $present->subDays(0)->endOfDay()->timestamp;
break;
case 'sevenday':
$begain_start_time = $present->subDays(13)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(6)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(6)->endOfDay()->timestamp;
break;
case 'week':
$begain_start_time = $present->subWeek()->startOfWeek()->timestamp;
$begain_end_time = $present->endOfWeek()->timestamp;
$last_start_time = $present->addWeek()->startOfWeek()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
case 'thirtyday':
$begain_start_time = $present->subDays(59)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(29)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(29)->endOfDay()->timestamp;
break;
case 'month':
$last_start_time = $present->subMonth()->startOfMonth()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
default:
$last_start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$last_end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
$begain_start_time = $last_start_time - ( $last_end_time - $last_start_time );
$begain_end_time = $last_end_time - ( $last_end_time - $last_start_time );
}
$stat_config = event('SiteStatType', [ 'site_type' => $this->app_module ], true);
$income = array_filter(array_column($stat_config, 'stat_type', 'key'));
$income_arr = [];
foreach ($income as $k => $v) {
$income_arr[ $v ][] = [
'value' => '0.00',
'type' => $k,
'is_calc' => $stat_config[ $k ][ 'is_calc' ] ?? '0',
];
}
$stat = new \app\model\site\SiteStat($this->app_module);
$stat_type = $stat->getStatType();
foreach ($stat_type as $k => $v) {
foreach ($v as $key => $item) {
if (empty($item[ 'is_stat' ])) unset($stat_type[ $k ][ $key ]);
}
}
$today_total_income = 0;//今日总收入
$today_total_expenditure = 0;//今日总支出
$field = '';
foreach ($income as $k => $v) {
$day_field = $stat_config[ $k ][ 'day_data' ];
$field .= 'sum(' . $day_field . ') as ' . $k . ',';
}
$field = trim($field, ',');
$today_stat_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $last_start_time, $last_end_time, $store_id)[ 'data' ] ?? [];
foreach ($income_arr as $key => $item) {
foreach ($item as $k => $v) {
$income_arr[ $key ][ $k ][ 'value' ] = number_format($today_stat_info[ $v[ 'type' ] ], 2, '.', '');
if ($key == 'income' && $v[ 'is_calc' ]) $today_total_income += $today_stat_info[ $v[ 'type' ] ];
if ($key == 'expenditure' && $v[ 'is_calc' ]) $today_total_expenditure += $today_stat_info[ $v[ 'type' ] ];
}
}
$field = 'sum(member_recharge_money_day) as member_recharge_money_day,
sum(service_order_money_day) as service_order_money_day,
sum(order_money_day) as order_money_day,
sum(member_card_money_day) as member_card_money_day,
sum(recharge_order_money_day) as recharge_order_money_day,
sum(timecard_order_money_day) as timecard_order_money_day
';
//本日/周/月...
$last_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $last_start_time, $last_end_time, $store_id)[ 'data' ] ?? [];
$last_data = [
'income' => number_format($today_total_income - $today_total_expenditure, 2, '.', ''),
'turnover' => number_format($today_total_income, 2, '.', ''),
'member_recharge_money_day' => $last_info[ 'member_recharge_money_day' ] ?? 0.00,//会员充值金额
'service_order_money_day' => $last_info[ 'service_order_money_day' ] ?? 0.00,//项目订单
'order_money_day' => $last_info[ 'order_money_day' ] ?? 0.00,//产品订单
'member_card_money_day' => $last_info[ 'member_card_money_day' ] ?? 0.00,//会员卡订单
'timecard_order_money_day' => $last_info[ 'timecard_order_money_day' ] ?? 0.00,//卡项订单
'recharge_order_money_day' => $last_info[ 'recharge_order_money_day' ] ?? 0.00,//充值订单
];
$desc_data = [
'income' => '统计时间内预估的净收入总额,预计收入 = 消费 + 办卡 + 充值 - 订单退款 - 分销佣金 - 会员提现',
'turnover' => '统计时间内,营业收入总额 = 消费 + 办卡 + 充值',
'member_recharge_money_day' => $stat_config[ 'member_recharge_money' ][ 'desc' ] ?? '',
'service_order_money_day' => $stat_config[ 'service_order_money' ][ 'desc' ] ?? '',
'order_money_day' => $stat_config[ 'order_money' ][ 'desc' ] ?? '',
'member_card_money_day' => $stat_config[ 'member_card_money' ][ 'desc' ] ?? '',
'timecard_order_money_day' => $stat_config[ 'timecard_order_money' ][ 'desc' ] ?? '',
'recharge_order_money_day' => $stat_config[ 'recharge_order_money' ][ 'desc' ] ?? '',
];
$data = [
'desc' => $desc_data,
'last_data' => $last_data,
];
return $this->response($this->success($data));
}
/**
* 营业额数据时间统计
*/
public function businessDataTimeStat()
{
$type = isset($this->params['type']) ? $this->params['type'] : 'today';
$field = isset($this->params['field']) ? $this->params['field'] : 'income';
$store_id = $this->store_id;
//时间统计信息
$present = Carbon::now();
$yesterday = Carbon::yesterday();
switch ( $type ) {
case 'today':
$last_start_time = $present->startOfDay()->timestamp;
$last_end_time = $present->endOfDay()->timestamp;
break;
case 'yesterday':
$last_start_time = $yesterday->startOfDay()->timestamp;
$last_end_time = $yesterday->endOfDay()->timestamp;
break;
case 'sevenday':
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(6)->endOfDay()->timestamp;
break;
case 'week':
$begain_start_time = $present->subWeek()->startOfWeek()->timestamp;
$begain_end_time = $present->endOfWeek()->timestamp;
$last_start_time = $present->addWeek()->startOfWeek()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
case 'thirtyday':
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(29)->endOfDay()->timestamp;
break;
case 'month':
$last_start_time = $present->subMonth()->startOfMonth()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
default:
$last_start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$last_end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
}
$arr = [];
$last_info_data = [];
$stat_shop_model = new SiteStatModel($this->site_id);
$order_common_model = new OrderCommonModel();
$stat_config = event('SiteStatType', [ 'site_type' => $this->app_module ], true);
$income = array_filter(array_column($stat_config, 'stat_type', 'key'));
$income_arr = [];
foreach ($income as $k => $v) {
$income_arr[ $v ][] = [
'value' => '0.00',
'type' => $k,
'is_calc' => $stat_config[ $k ][ 'is_calc' ] ?? '0',
'day_data' => $stat_config[ $k ][ 'day_data' ] ?? '',
];
}
$today_total_income = 0;//总收入
$today_total_expenditure = 0;//总支出
$field_refer = '';
foreach ($income as $k => $v) {
$day_field = $stat_config[ $k ][ 'day_data' ];
$field_refer .= 'sum(' . $day_field . ') as ' . $day_field . ',';
}
$field_refer = trim($field_refer, ',');
if ($type != 'today' && $type != 'yesterday') {
$last_period = CarbonPeriod::create(date('Y-m-d', $last_start_time), date('Y-m-d', $last_end_time));
$last_date_temp = [];
foreach ($last_period as $k => $date) {
$last_date_temp[ $k ][ 'year' ] = $date->format('Y');
$last_date_temp[ $k ][ 'month' ] = $date->format('m');
$last_date_temp[ $k ][ 'day' ] = $date->format('d');
$last_date_temp[ $k ][ 'date' ] = $date->format('Y-m-d');
}
foreach ($last_date_temp as $k => $v) {
$start_time = Carbon::create($v[ 'year' ], $v[ 'month' ], $v[ 'day' ], 0, 0, 0)->timestamp;
$end_time = Carbon::create($v[ 'year' ], $v[ 'month' ], $v[ 'day' ], 23, 59, 59)->timestamp;
// $last_total_commission = $order_common_model->orderStatistics([ [ 'order_status', '=', 'complete' ], [ 'site_id', '=', $this->site_id ], [ 'complete_time', 'between', [ $start_time, $end_time ] ] ], 'sum', 'total_commission');
$last_info = $stat_shop_model->getStatSite($this->site_id, $v[ 'year' ], $v[ 'month' ], $v[ 'day' ], $field_refer, $store_id)[ 'data' ] ?? [];
$today_stat_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field_refer, strtotime($v[ 'date' ]), strtotime($v[ 'date' ]) + 86399, $store_id)[ 'data' ] ?? [];
foreach ($income_arr as $key => $item) {
foreach ($item as $bond => $value) {
$income_arr[ $key ][ $bond ][ 'value' ] = number_format($today_stat_info[ $value[ 'day_data' ] ], 2, '.', '');
if ($key == 'income' && $value[ 'is_calc' ]) $today_total_income += $today_stat_info[ $value[ 'day_data' ] ];
if ($key == 'expenditure' && $value[ 'is_calc' ]) $today_total_expenditure += $today_stat_info[ $value[ 'day_data' ] ];
}
}
$last_data = [
'income' => number_format($today_total_income - $today_total_expenditure, 2, '.', ''),
'turnover' => number_format($today_total_income, 2, '.', ''),
'member_card_money_day' => $last_info[ 'member_card_money_day' ] ?? 0.00,
'member_recharge_money_day' => $last_info[ 'member_recharge_money_day' ] ?? 0.00,
'order_money_day' => $last_info[ 'order_money_day' ] ?? 0.00,
'service_order_money_day' => $last_info[ 'service_order_money_day' ] ?? 0.00,
'timecard_order_money_day' => $last_info[ 'timecard_order_money_day' ] ?? 0.00,
];
$last_info_data[ $k ] = $last_data;
}
$last_arr = array_column($last_info_data, $field);
$arr[ 'last_date_temp' ] = implode(',', array_column($last_date_temp, 'date'));
} else if ($type == 'today') {
switch ( $field ) {
case 'income':
$last_order_money_day = $stat_shop_model->getStatSiteDay($this->site_id, 'order_money_day', $present->year, $present->month, $present->day, $store_id)[ 'data' ];
$last_info_data = [];
foreach ($income_arr[ 'income' ] as $key => $value) {
$last_data = $stat_shop_model->getStatSiteDay($this->site_id, $value[ 'day_data' ], $present->year, $present->month, $present->day, $store_id)[ 'data' ];
foreach ($last_order_money_day as $k => $v) {
if (strstr($k, 'hour_')) {
if (!isset($last_info_data[ $k ])) $last_info_data[ $k ] = 0;
$last_info_data[ $k ] += $last_data[ $k ];
}
}
}
foreach ($income_arr[ 'expenditure' ] as $key => $value) {
$last_data = $stat_shop_model->getStatSiteDay($this->site_id, $value[ 'day_data' ], $present->year, $present->month, $present->day, $store_id)[ 'data' ];
foreach ($last_order_money_day as $k => $v) {
if (strstr($k, 'hour_')) {
if (!isset($last_info_data[ $k ])) $last_info_data[ $k ] = 0;
$last_info_data[ $k ] -= $last_data[ $k ];
}
}
}
break;
case 'turnover':
$last_order_money_day = $stat_shop_model->getStatSiteDay($this->site_id, 'order_money_day', $present->year, $present->month, $present->day, $store_id)[ 'data' ];
$last_info_data = [];
foreach ($income_arr[ 'income' ] as $key => $value) {
$last_data = $stat_shop_model->getStatSiteDay($this->site_id, $value[ 'day_data' ], $present->year, $present->month, $present->day, $store_id)[ 'data' ];
foreach ($last_order_money_day as $k => $v) {
if (strstr($k, 'hour_')) {
if (!isset($last_info_data[ $k ])) $last_info_data[ $k ] = 0;
$last_info_data[ $k ] += $last_data[ $k ];
}
}
}
break;
default :
$last_info_data = $stat_shop_model->getStatSiteDay($this->site_id, $field, $present->year, $present->month, $present->day, $store_id)[ 'data' ];
break;
}
foreach ($last_info_data as $k => $v) {
if (strstr($k, 'hour_') == false) {
unset($last_info_data[ $k ]);
}
}
$last_arr = $last_info_data;
} else if ($type == 'yesterday') {
switch ( $field ) {
case 'income':
$last_order_money_day = $stat_shop_model->getStatSiteDay($this->site_id, 'order_money_day', $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
$last_info_data = [];
foreach ($income_arr[ 'income' ] as $key => $value) {
$last_data = $stat_shop_model->getStatSiteDay($this->site_id, $value[ 'day_data' ], $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
foreach ($last_order_money_day as $k => $v) {
if (strstr($k, 'hour_')) {
if (!isset($last_info_data[ $k ])) $last_info_data[ $k ] = 0;
$last_info_data[ $k ] += $last_data[ $k ];
}
}
}
foreach ($income_arr[ 'expenditure' ] as $key => $value) {
$last_data = $stat_shop_model->getStatSiteDay($this->site_id, $value[ 'day_data' ], $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
foreach ($last_order_money_day as $k => $v) {
if (strstr($k, 'hour_')) {
if (!isset($last_info_data[ $k ])) $last_info_data[ $k ] = 0;
$last_info_data[ $k ] -= $last_data[ $k ];
}
}
}
break;
case 'turnover':
$last_order_money_day = $stat_shop_model->getStatSiteDay($this->site_id, 'order_money_day', $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
$last_info_data = [];
foreach ($income_arr[ 'income' ] as $key => $value) {
$last_data = $stat_shop_model->getStatSiteDay($this->site_id, $value[ 'day_data' ], $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
foreach ($last_order_money_day as $k => $v) {
if (strstr($k, 'hour_')) {
if (!isset($last_info_data[ $k ])) $last_info_data[ $k ] = 0;
$last_info_data[ $k ] += $last_data[ $k ];
}
}
}
break;
default :
$last_info_data = $stat_shop_model->getStatSiteDay($this->site_id, $field, $yesterday->year, $yesterday->month, $yesterday->day)[ 'data' ];
break;
}
foreach ($last_info_data as $k => $v) {
if (strstr($k, 'hour_') == false) {
unset($last_info_data[ $k ]);
}
}
$last_arr = $last_info_data;
}
$arr[ 'last_arr' ] = implode(',', $last_arr);
return $this->response($this->success($arr));
}
/**
* 今日营业额数据
*/
public function businessTodayInfo()
{
$type = isset($this->params['type']) ? $this->params['type'] : 'today';
$store_id = $this->store_id;
$present = Carbon::now();
$stat_shop_model = new SiteStatModel($this->site_id);
switch ( $type ) {
case 'today':
$start_time = $present->startOfDay()->timestamp;
$end_time = $present->endOfDay()->timestamp;
break;
case 'yesterday':
$yesterday = Carbon::yesterday();
$start_time = $yesterday->startOfDay()->timestamp;
$end_time = $yesterday->endOfDay()->timestamp;
break;
case 'sevenday':
$start_time = $present->subDays(6)->startOfDay()->timestamp;
$end_time = $present->addDays(6)->endOfDay()->timestamp;
break;
case 'week':
$start_time = $present->startOfWeek()->timestamp;
$end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
case 'thirtyday':
$start_time = $present->subDays(29)->startOfDay()->timestamp;
$end_time = $present->addDays(29)->endOfDay()->timestamp;
break;
case 'month':
$start_time = $present->startOfMonth()->timestamp;
$end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
default:
$start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
}
$stat_config = event('SiteStatType', [ 'site_type' => $this->app_module ], true);
$income = array_filter(array_column($stat_config, 'stat_type', 'key'));
$income_arr = [];
foreach ($income as $k => $v) {
$income_arr[ $v ][] = [
'value' => '0.00',
'type' => $k,
'is_calc' => $stat_config[ $k ][ 'is_calc' ] ?? '0',
];
}
$today_total_income = 0;//今日总收入
$today_total_expenditure = 0;//今日总支出
$field = '';
foreach ($income as $k => $v) {
$day_field = $stat_config[ $k ][ 'day_data' ];
$field .= 'sum(' . $day_field . ') as ' . $k . ',';
}
$field = trim($field, ',');
$today_stat_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $start_time, $end_time, $store_id)[ 'data' ] ?? [];
foreach ($income_arr as $key => $item) {
foreach ($item as $k => $v) {
$income_arr[ $key ][ $k ][ 'value' ] = number_format($today_stat_info[ $v[ 'type' ] ], 2, '.', '');
if ($key == 'income' && $v[ 'is_calc' ]) $today_total_income += $today_stat_info[ $v[ 'type' ] ];
if ($key == 'expenditure' && $v[ 'is_calc' ]) $today_total_expenditure += $today_stat_info[ $v[ 'type' ] ];
}
}
$field = 'sum(refund_money_day) as refund_money_day, sum(member_withdraw_money_day) as member_withdraw_money_day, sum(fenxiao_commission_money_day) as fenxiao_commission_money_day';
$info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $start_time, $end_time, $store_id)[ 'data' ] ?? [];
$data = [
'income' => number_format($today_total_income - $today_total_expenditure, 2, '.', ''),//营业额
'turnover' => number_format($today_total_income, 2, '.', ''),//收入
'refund_money_day' => $info[ 'refund_money_day' ] ?? 0.00,
'member_withdraw_money_day' => $info[ 'member_withdraw_money_day' ] ?? 0.00,
'fenxiao_commission_money_day' => $info[ 'fenxiao_commission_money_day' ] ?? 0.00,
];
return $this->response($this->success($data));
}
/********************************************************* 营业数据 ***************************************************************/
/********************************************************* 客户数据 ***************************************************************/
/**
* 客户数据统计
*/
public function customerDataTimeStat()
{
$type = isset($this->params['type']) ? $this->params['type'] : 'today';
$field = isset($this->params['field']) ? $this->params['field'] : 'member_count_total';
$store_id = $this->store_id;
//时间统计信息
$present = Carbon::now();
switch ( $type ) {
case 'today':
$yesterday = Carbon::yesterday();
$begain_start_time = $yesterday->startOfDay()->timestamp;
$begain_end_time = $yesterday->endOfDay()->timestamp;
$last_start_time = $present->startOfDay()->timestamp;
$last_end_time = $present->endOfDay()->timestamp;
break;
case 'yesterday':
$yesterday = Carbon::yesterday();
$begain_start_time = $yesterday->startOfDay()->timestamp - 86400;
$begain_end_time = $yesterday->endOfDay()->timestamp - 86400;
$last_start_time = $yesterday->startOfDay()->timestamp;
$last_end_time = $yesterday->endOfDay()->timestamp;
break;
case 'sevenday':
$begain_start_time = $present->subDays(13)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(6)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(6)->endOfDay()->timestamp;
break;
case 'week':
$begain_start_time = $present->subWeek()->startOfWeek()->timestamp;
$begain_end_time = $present->endOfWeek()->timestamp;
$last_start_time = $present->addWeek()->startOfWeek()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
case 'thirtyday':
$begain_start_time = $present->subDays(59)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(29)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(29)->endOfDay()->timestamp;
break;
case 'month':
$begain_start_time = $present->subMonth()->startOfMonth()->timestamp;
$begain_end_time = $present->endOfMonth()->timestamp;
$last_start_time = $present->addMonth()->startOfMonth()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
default:
$last_start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$last_end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
$begain_start_time = $last_start_time - ( $last_end_time - $last_start_time );
$begain_end_time = $last_end_time - ( $last_end_time - $last_start_time );
}
$arr = [];
$last_info_data = [];
$stat_shop_model = new SiteStatModel($this->site_id);
$field_refer = 'max(member_count_total) as member_count_total, sum(member_count_day) as member_count_day, sum(order_count_day) as order_count_day, sum(pay_member_day) as pay_member_day, sum(recharge_member_day) as recharge_member_day, sum(coupon_member_day) as coupon_member_day';
if ($type != 'today' && $type != 'yesterday') {
$last_period = CarbonPeriod::create(date('Y-m-d', $last_start_time), date('Y-m-d', $last_end_time));
$last_date_temp = [];
foreach ($last_period as $k => $date) {
$last_date_temp[ $k ][ 'year' ] = $date->format('Y');
$last_date_temp[ $k ][ 'month' ] = $date->format('m');
$last_date_temp[ $k ][ 'day' ] = $date->format('d');
$last_date_temp[ $k ][ 'date' ] = $date->format('Y-m-d');
}
foreach ($last_date_temp as $k => $v) {
$last_info = $stat_shop_model->getStatSite($this->site_id, $v[ 'year' ], $v[ 'month' ], $v[ 'day' ], $field_refer, $store_id)[ 'data' ] ?? [];
$last_data = [
'member_count_total' => $last_info[ 'member_count_total' ] ?? 0,
'member_count_day' => $last_info[ 'member_count_day' ] ?? 0,
'order_count_day' => $last_info[ 'order_count_day' ] ?? 0,
'pay_member_day' => $last_info[ 'pay_member_day' ] ?? 0,
'recharge_member_day' => $last_info[ 'recharge_member_day' ] ?? 0,
'coupon_member_day' => $last_info[ 'coupon_member_day' ] ?? 0,
];
$last_info_data[ $k ] = $last_data;
}
$last_arr = array_column($last_info_data, $field);
$arr[ 'last_date_temp' ] = implode(',', array_column($last_date_temp, 'date'));
} else if ($type == 'today') {
if ($field == 'member_count_total') {
$last_date = [
'year' => date('Y', $last_start_time-1),
'month' => date('m', $last_start_time-1),
'day' => date('d', $last_start_time-1),
];
$last_info_member_count_data = $stat_shop_model->getStatSiteDay($this->site_id, 'member_count_day', $present->year, $present->month, $present->day, $store_id)[ 'data' ];
$last_info = $stat_shop_model->getStatSite($this->site_id, $last_date[ 'year' ], $last_date[ 'month' ], $last_date[ 'day' ], $field_refer, $store_id)[ 'data' ] ?? [];
foreach ($last_info_member_count_data as $k => $v) {
if (strstr($k, 'hour_') != false) {
$last_hour_num = 0;
$k = ltrim($k, 'hour_');
for ($i = 0; $k >= $i; $i++) {
$last_hour_num += $last_info_member_count_data[ 'hour_' . $i ];
}
$last_info_data[ 'hour_' . $k ] = ( $last_info[ 'member_count_total' ] ?? 0 ) + (int) $last_hour_num;
}
}
} else {
$last_info_data = $stat_shop_model->getStatSiteDay($this->site_id, $field, $present->year, $present->month, $present->day, $store_id)[ 'data' ];
}
foreach ($last_info_data as $k => $v) {
if (strstr($k, 'hour_') == false) {
unset($last_info_data[ $k ]);
}
}
$last_arr = $last_info_data;
} else if ($type == 'yesterday') {
if ($field == 'member_count_total') {
$last_date = [
'year' => date('Y', $last_start_time-1),
'month' => date('m', $last_start_time-1),
'day' => date('d', $last_start_time-1),
];
$last_info_member_count_data = $stat_shop_model->getStatSiteDay($this->site_id, 'member_count_day', $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
$last_info = $stat_shop_model->getStatSite($this->site_id, $last_date[ 'year' ], $last_date[ 'month' ], $last_date[ 'day' ], $field_refer, $store_id)[ 'data' ] ?? [];
foreach ($last_info_member_count_data as $k => $v) {
if (strstr($k, 'hour_') != false) {
$last_hour_num = 0;
$k = ltrim($k, 'hour_');
for ($i = 0; $k >= $i; $i++) {
$last_hour_num += $last_info_member_count_data[ 'hour_' . $i ];
}
$last_info_data[ 'hour_' . $k ] = ( $last_info[ 'member_count_total' ] ?? 0 ) + (int) $last_hour_num;
}
}
} else {
$last_info_data = $stat_shop_model->getStatSiteDay($this->site_id, $field, $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
}
foreach ($last_info_data as $k => $v) {
if (strstr($k, 'hour_') == false) {
unset($last_info_data[ $k ]);
}
}
$last_arr = $last_info_data;
}
$arr[ 'last_arr' ] = implode(',', $last_arr);
return $this->response($this->success($arr));
}
/**
* 客户数据信息
*/
public function customerDataStat()
{
$type = isset($this->params['type']) ? $this->params['type'] : 'today';
$store_id = $this->store_id;
$stat_shop_model = new SiteStatModel($this->site_id);
$stat_config = event('SiteStatType', [ 'site_type' => $this->app_module ], true);
$present = Carbon::now();
switch ( $type ) {
case 'today':
$last_start_time = $present->startOfDay()->timestamp;
$last_end_time = $present->endOfDay()->timestamp;
break;
case 'yesterday':
$yesterday = Carbon::yesterday();
$last_start_time = $yesterday->startOfDay()->timestamp;
$last_end_time = $yesterday->endOfDay()->timestamp;
break;
case 'sevenday':
$begain_start_time = $present->subDays(13)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(6)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(6)->endOfDay()->timestamp;
break;
case 'week':
$begain_start_time = $present->subWeek()->startOfWeek()->timestamp;
$begain_end_time = $present->endOfWeek()->timestamp;
$last_start_time = $present->addWeek()->startOfWeek()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
case 'thirtyday':
$begain_start_time = $present->subDays(59)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(29)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(29)->endOfDay()->timestamp;
break;
case 'month':
$begain_start_time = $present->subMonth()->startOfMonth()->timestamp;
$begain_end_time = $present->endOfMonth()->timestamp;
$last_start_time = $present->addMonth()->startOfMonth()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
default :
$last_start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$last_end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
$begain_start_time = $last_start_time - ( $last_end_time - $last_start_time );
$begain_end_time = $last_end_time - ( $last_end_time - $last_start_time );
}
$field = 'max(member_count_total) as member_count_total, sum(member_count_day) as member_count_day, sum(order_count_day) as order_count_day, sum(pay_member_day) as pay_member_day, sum(recharge_member_day) as recharge_member_day, sum(coupon_member_day) as coupon_member_day';
//本日/周/月...
$last_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $last_start_time, $last_end_time, $store_id)[ 'data' ] ?? [];
$last_data = [
'member_count_total' => $last_info[ 'member_count_total' ] ?? 0,
'member_count_day' => $last_info[ 'member_count_day' ] ?? 0,
'order_count_day' => $last_info[ 'order_count_day' ] ?? 0,
'pay_member_day' => $last_info[ 'pay_member_day' ] ?? 0,
'recharge_member_day' => $last_info[ 'recharge_member_day' ] ?? 0,
'coupon_member_day' => $last_info[ 'coupon_member_day' ] ?? 0,
];
$desc_data = [
'member_count_total' => '截止到统计时间,店铺的客户总数',
'member_count_day' => $stat_config[ 'member_count' ][ 'desc' ] ?? '',
'order_count_day' => $stat_config[ 'order_count' ][ 'desc' ] ?? '',
'pay_member_day' => $stat_config[ 'pay_member' ][ 'desc' ] ?? '',
'recharge_member_day' => $stat_config[ 'recharge_member' ][ 'desc' ] ?? '',
'coupon_member_day' => $stat_config[ 'coupon_member' ][ 'desc' ] ?? '',
];
$data = [
'desc' => $desc_data,
'last_data' => $last_data,
];
return $this->response($this->success($data));
}
/********************************************************* 客户数据 ***************************************************************/
/********************************************************* 流量数据 ***************************************************************/
/**
* 流量数据信息
*
*/
public function flowDataStat()
{
$type = isset($this->params['type']) ? $this->params['type'] : 'today';
$store_id = $this->store_id;
$stat_shop_model = new SiteStatModel($this->site_id);
$present = Carbon::now();
switch ( $type ) {
case 'today':
$yesterday = Carbon::yesterday();
$begain_start_time = $yesterday->startOfDay()->timestamp;
$begain_end_time = $yesterday->endOfDay()->timestamp;
$last_start_time = $present->startOfDay()->timestamp;
$last_end_time = $present->endOfDay()->timestamp;
$earlier_start_time = $yesterday->startOfDay()->subDay()->timestamp;
$earlier_end_time = $yesterday->endOfDay()->timestamp;
break;
case 'yesterday':
$yesterday = Carbon::yesterday();
$last_start_time = $yesterday->startOfDay()->timestamp;
$last_end_time = $yesterday->endOfDay()->timestamp;
$begain_start_time = $last_start_time - 86400;
$begain_end_time = $last_end_time - 86400;
$earlier_start_time = $last_start_time - 86400 * 2;
$earlier_end_time = $last_end_time - 86400 * 2;
break;
case 'sevenday':
$begain_start_time = $present->subDays(13)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(6)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(6)->endOfDay()->timestamp;
$earlier_start_time = $present->subDays(20)->startOfDay()->timestamp;
$earlier_end_time = $present->addDays(6)->endOfDay()->timestamp;
break;
case 'week':
$begain_start_time = $present->subWeek()->startOfWeek()->timestamp;
$begain_end_time = $present->endOfWeek()->timestamp;
$last_start_time = $present->addWeek()->startOfWeek()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
$earlier_start_time = $present->subWeek(2)->startOfWeek()->timestamp;
$earlier_end_time = $present->endOfWeek()->timestamp;
break;
case 'thirtyday':
$begain_start_time = $present->subDays(59)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(29)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(29)->endOfDay()->timestamp;
$earlier_start_time = $present->subDays(89)->startOfDay()->timestamp;
$earlier_end_time = $present->addDays(29)->endOfDay()->timestamp;
break;
case 'month':
$begain_start_time = $present->subMonth()->startOfMonth()->timestamp;
$begain_end_time = $present->endOfMonth()->timestamp;
$last_start_time = $present->addMonth()->startOfMonth()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
$earlier_start_time = $present->subMonth(2)->startOfWeek()->timestamp;
$earlier_end_time = $present->endOfWeek()->timestamp;
break;
default:
$last_start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$last_end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
$begain_start_time = $last_start_time - ( $last_end_time - $last_start_time );
$begain_end_time = $last_end_time - ( $last_end_time - $last_start_time );
$earlier_start_time = $last_start_time - ( $last_end_time - $last_start_time ) * 2;
$earlier_end_time = $last_end_time - ( $last_end_time - $last_start_time ) * 2;
}
$field = 'sum(visitor_day) as visitor_day, sum(visit_count_day) as visit_count_day, sum(pay_member_day) as pay_member_day,sum(visitor_h5_day) as visitor_h5_day,sum(visitor_weapp_day) as visitor_weapp_day,sum(visitor_app_day) as visitor_app_day';
$earlier_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $earlier_start_time, $earlier_end_time, $store_id)[ 'data' ] ?? [];
//上日/月、周..
$begain_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $begain_start_time, $begain_end_time, $store_id)[ 'data' ] ?? [];
$begain_data = [
'visitor_h5_day' => $begain_info[ 'visitor_h5_day' ] ?? 0,
'visitor_weapp_day' => $begain_info[ 'visitor_weapp_day' ] ?? 0,
'visitor_app_day' => $begain_info[ 'visitor_app_day' ] ?? 0,
'visitor_day' => $begain_info[ 'visitor_day' ] ?? 0,
'add_visitor_day' => ( ( $begain_info[ 'visitor_day' ] - $earlier_info[ 'visitor_day' ] ) >= 0 ) ? ( $begain_info[ 'visitor_day' ] - $earlier_info[ 'visitor_day' ] ) : 0,
'visit_count_day' => $begain_info[ 'visit_count_day' ] ?? 0,
'pay_member_day' => $begain_info[ 'pay_member_day' ] ?? 0,
'visitor_pay_percent' => $begain_info[ 'pay_member_day' ] > 0 ? $begain_info[ 'visitor_day' ] > 0 ? sprintf("%.2f", $begain_info[ 'pay_member_day' ] / $begain_info[ 'visitor_day' ] * 100) : $begain_info[ 'pay_member_day' ] : 0,
];
//本日/周/月...
$last_info = $stat_shop_model->getStatSiteByCondition($this->site_id, $field, $last_start_time, $last_end_time,$store_id)[ 'data' ] ?? [];
$last_data = [
'visitor_h5_day' => $last_info[ 'visitor_h5_day' ] ?? 0,
'visitor_weapp_day' => $last_info[ 'visitor_weapp_day' ] ?? 0,
'visitor_app_day' => $last_info[ 'visitor_app_day' ] ?? 0,
'visitor_day' => $last_info[ 'visitor_day' ] ?? 0,
'add_visitor_day' => ( ( $last_info[ 'visitor_day' ] - $begain_info[ 'visitor_day' ] ) >= 0 ) ? ( $last_info[ 'visitor_day' ] - $begain_info[ 'visitor_day' ] ) : 0,
'visit_count_day' => $last_info[ 'visit_count_day' ] ?? 0,
'pay_member_day' => $last_info[ 'pay_member_day' ] ?? 0,
'visitor_pay_percent' => $last_info[ 'pay_member_day' ] > 0 ? $last_info[ 'visitor_day' ] > 0 ? sprintf("%.2f", $last_info[ 'pay_member_day' ] / $last_info[ 'visitor_day' ] * 100) : $last_info[ 'pay_member_day' ] : 0,
];
//同比
$rate_data = [
'visitor_day' => diff_rate($last_data[ 'visitor_day' ], $begain_data[ 'visitor_day' ]),
'add_visitor_day' => diff_rate($last_data[ 'add_visitor_day' ], $begain_data[ 'add_visitor_day' ]),
'visit_count_day' => diff_rate($last_data[ 'visit_count_day' ], $begain_data[ 'visit_count_day' ]),
'pay_member_day' => diff_rate($last_data[ 'pay_member_day' ], $begain_data[ 'pay_member_day' ]),
'visitor_pay_percent' => diff_rate($last_data[ 'visitor_pay_percent' ], $begain_data[ 'visitor_pay_percent' ]),
];
$data = [
'begain_data' => $begain_data,
'last_data' => $last_data,
'rate_data' => $rate_data,
];
return $this->response($this->success($data));
}
/**
* 流量数据信息时间统计
*/
public function flowDataTimeStat()
{
$type = isset($this->params['type']) ? $this->params['type'] : 'today';
$field = isset($this->params['field']) ? $this->params['field'] : 'visitor_day';
$store_id = $this->store_id;
//时间统计信息
$present = Carbon::now();
$yesterday = Carbon::yesterday();
switch ( $type ) {
case 'today':
$yesterday = Carbon::yesterday();
$begain_start_time = $yesterday->startOfDay()->timestamp;
$begain_end_time = $yesterday->endOfDay()->timestamp;
$last_start_time = $present->startOfDay()->timestamp;
$last_end_time = $present->endOfDay()->timestamp;
break;
case 'yesterday':
$yesterday = Carbon::yesterday();
$begain_start_time = $yesterday->startOfDay()->timestamp - 84600;
$begain_end_time = $yesterday->endOfDay()->timestamp - 86400;
$last_start_time = $yesterday->startOfDay()->timestamp;
$last_end_time = $yesterday->endOfDay()->timestamp;
break;
case 'sevenday':
$begain_start_time = $present->subDays(13)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(6)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(6)->endOfDay()->timestamp;
break;
case 'week':
$begain_start_time = $present->subWeek()->startOfWeek()->timestamp;
$begain_end_time = $present->endOfWeek()->timestamp;
$last_start_time = $present->addWeek()->startOfWeek()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
case 'thirtyday':
$begain_start_time = $present->subDays(59)->startOfDay()->timestamp;
$begain_end_time = $present->addDays(29)->endOfDay()->timestamp;
$last_start_time = $present->addDays()->startOfDay()->timestamp;
$last_end_time = $present->addDays(29)->endOfDay()->timestamp;
break;
case 'month':
$begain_start_time = $present->subMonth()->startOfMonth()->timestamp;
$begain_end_time = $present->endOfMonth()->timestamp;
$last_start_time = $present->addMonth()->startOfMonth()->timestamp;
$last_end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
default :
$last_start_time = isset($this->params['start_time']) ? strtotime($this->params['start_time']) : strtotime(date('Y-m-d'));
$last_end_time = isset($this->params['end_time']) ? strtotime($this->params['end_time']) : strtotime(date('Y-m-d')) + 86400;
$begain_start_time = $last_start_time - ( $last_end_time - $last_start_time );
$begain_end_time = $last_end_time - ( $last_end_time - $last_start_time );
}
$current_arr = [];
$stat_shop_model = new SiteStatModel($this->site_id);
$field_refer = 'sum(visitor_day) as visitor_day, sum(visitor_h5_day) as visitor_h5_day, sum(visitor_weapp_day) as visitor_weapp_day, sum(visitor_app_day) as visitor_app_day';
if ($type != 'today' && $type != 'yesterday') {
$last_period = CarbonPeriod::create(date('Y-m-d', $last_start_time), date('Y-m-d', $last_end_time));
$last_date_temp = [];
foreach ($last_period as $k => $date) {
$last_date_temp[ $k ][ 'year' ] = $date->format('Y');
$last_date_temp[ $k ][ 'month' ] = $date->format('m');
$last_date_temp[ $k ][ 'day' ] = $date->format('d');
$last_date_temp[ $k ][ 'date' ] = $date->format('Y-m-d');
}
$begain_period = CarbonPeriod::create(date('Y-m-d', $begain_start_time), date('Y-m-d', $begain_end_time));
$begain_date_temp = [];
foreach ($begain_period as $k => $date) {
$begain_date_temp[ $k ][ 'year' ] = $date->format('Y');
$begain_date_temp[ $k ][ 'month' ] = $date->format('m');
$begain_date_temp[ $k ][ 'day' ] = $date->format('d');
}
$visitor_h5_day = [];
$visitor_weapp_day = [];
$visitor_app_day = [];
$last_visitor_day = [];
$begain_visitor_day = [];
foreach ($last_date_temp as $k => $v) {
$last_info = $stat_shop_model->getStatSite($this->site_id, $v[ 'year' ], $v[ 'month' ], $v[ 'day' ], $field_refer, $store_id)[ 'data' ] ?? [];
$last_data = [
'visitor_day' => $last_info[ 'visitor_day' ] ?? 0,
'visitor_h5_day' => $last_info[ 'visitor_h5_day' ] ?? 0,
'visitor_weapp_day' => $last_info[ 'visitor_weapp_day' ] ?? 0,
'visitor_app_day' => $last_info[ 'visitor_app_day' ] ?? 0,
];
$last_visitor_day[ $k ] = $last_data[ 'visitor_day' ];
$visitor_h5_day[ $k ] = $last_data[ 'visitor_h5_day' ];
$visitor_weapp_day[ $k ] = $last_data[ 'visitor_weapp_day' ];
$visitor_app_day[ $k ] = $last_data[ 'visitor_app_day' ];
}
foreach ($begain_date_temp as $k => $v) {
$begain_info = $stat_shop_model->getStatSite($this->site_id, $v[ 'year' ], $v[ 'month' ], $v[ 'day' ], $field_refer, $store_id)[ 'data' ] ?? [];
$last_data = [
'visitor_day' => $begain_info[ 'visitor_day' ] ?? 0,
];
$begain_visitor_day[ $k ] = $last_data[ 'visitor_day' ];
}
$current_arr[ 'laster_visitor_day' ] = implode(',', $last_visitor_day);
$current_arr[ 'begain_visitor_day' ] = implode(',', $begain_visitor_day);
$current_arr[ 'visitor_h5_day' ] = implode(',', $visitor_h5_day);
$current_arr[ 'visitor_weapp_day' ] = implode(',', $visitor_weapp_day);
$current_arr[ 'visitor_app_day' ] = implode(',', $visitor_app_day);
$current_arr[ 'last_date_temp' ] = implode(',', array_column($last_date_temp, 'date'));
} else if ($type == 'today') {
switch ( $field ) {
case 'visitor_day':
$current_arr[ 'laster_visitor_day' ] = $stat_shop_model->getStatSiteDay($this->site_id, 'visitor_day', $present->year, $present->month, $present->day, $store_id)[ 'data' ];
break;
default :
break;
}
$current_arr[ $field ] = $stat_shop_model->getStatSiteDay($this->site_id, $field, $present->year, $present->month, $present->day, $store_id)[ 'data' ];
foreach ($current_arr as $k => $v) {
foreach ($v as $key => $val) {
if (strstr($key, 'hour_') == false) {
unset($current_arr[ $k ][ $key ]);
}
}
$current_arr[ $k ] = implode(',', $current_arr[ $k ]);
}
} else if ($type == 'yesterday') {
switch ( $field ) {
case 'visitor_day':
$current_arr[ 'laster_visitor_day' ] = $stat_shop_model->getStatSiteDay($this->site_id, 'visitor_day', $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
break;
default :
break;
}
$current_arr[ $field ] = $stat_shop_model->getStatSiteDay($this->site_id, $field, $yesterday->year, $yesterday->month, $yesterday->day, $store_id)[ 'data' ];
foreach ($current_arr as $k => $v) {
foreach ($v as $key => $val) {
if (strstr($key, 'hour_') == false) {
unset($current_arr[ $k ][ $key ]);
}
}
$current_arr[ $k ] = implode(',', $current_arr[ $k ]);
}
}
return $this->response($this->success($current_arr));
}
/********************************************************* 流量数据 ***************************************************************/
}