|
|
<?php
namespace App\Admin\Controllers\v3;
use App\Admin\Actions\Metrics\Distance;use App\Admin\Actions\Metrics\Shipping;use App\Admin\Actions\Tools\DataReportDate;use App\Admin\Actions\Tools\DataReportOption;use App\Admin\Common\Order;use App\Admin\Extensions\Chart\Bar\OrderBar;use App\Admin\Extensions\Chart\PolarArea\Market;use App\Models\ImsCjdcMarket;use App\Models\v3\User;use Dcat\Admin\Layout\Column;use Dcat\Admin\Layout\Content;use Dcat\Admin\Layout\Row;use Dcat\Admin\Widgets\Card;use Illuminate\Support\Facades\DB;
class DataReport{ /** * 数据报表 * @param Content $content * @return Content */ protected $_amount; protected $_number; protected $_count_user; protected $_shipping; protected $_distance; protected $_order_count_user; protected $_market; public function __construct() { $option = request()->get('option',1); $marketId = request()->get('market_id',''); $this->_amount = Order::getOrderData([ 'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'amount',//取什么数据 data_type 数据类型
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null ],$option); $this->_number = Order::getOrderData([ 'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'num',//取什么数据 data_type 数据类型
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null ],$option); $this->_count_user = count(array_unique($this->_number)); $this->_shipping = Order::getOrderData([ 'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'shipping',//取什么数据 data_type 数据类型
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null ],$option); $this->_distance = Order::getOrderData([ 'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'distance',//取什么数据 data_type 数据类型
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null ],$option); $this->_order_count_user = Order::getOrderData([ 'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'order_count_user',//取什么数据 data_type 数据类型
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null ],$option); $this->_market = Order::getOrderData([ 'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'market',//取什么数据 data_type 数据类型
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null ],$option); }
public function index(Content $content) { return $content ->header('订单数据') ->body(function (Row $row){ $row->column(4,function (Column $column){ $column->row(new \App\Admin\Actions\Tools\DataReportTime('data_report')); }); $row->column(2,function (Column $column){ $markets = ImsCjdcMarket::getMarket(); $data = [['value'=>0,'label'=>'全部市场']]; foreach ($markets as $key=>$val){ $item = []; $item['value'] = $key; $item['label'] = $val; $data[] = $item; } $column->row(new DataReportOption('data_report',$data)); });
$row->column(6,function (Column $column){ $column->row(new DataReportDate('data_report')); });
})->body('<hr />') ->body(function (Row $row){ $row->column(2,function (Column $column){ $title = "订单数"; $value = count($this->_number); $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>"); $card->style('background-color:#4e9876'); $column->row($card); });
$row->column(2,function (Column $column){ $title = "订单总额(元)"; $value = $this->_amount; $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>"); $card->style('background-color:#4e9876'); $column->row($card); });
$row->column(2,function (Column $column) { $title = "下单人数"; $value = $this->_count_user; $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>"); $card->style('background-color:#4e9876'); $column->row($card); }); $row->column(2,function (Column $column){ $title = "人均单价(元)"; if ($this->_amount&&$this->_count_user){ $value = sprintf("%.2f",$this->_amount/$this->_count_user); }else{ $value=0; }
$card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>"); $card->style('background-color:#4e9876'); $column->row($card); }); $row->column(2,function (Column $column){ $title = "线上用户总数"; $value = User::where('nick_name','!=','')->count(); $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>"); $card->style('background-color:#4e9876'); $column->row($card); }); $row->column(2,function (Column $column){ $title = "下过单的用户数"; $value = $this->_order_count_user; $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>"); $card->style('background-color:#4e9876'); $column->row($card); }); }) ->body(function (Row $row){ $row->column(8,function (Column $column){ $card = new Card(); $card->title('订单图表'); //默认查询最近20天的数据
$dateTime = request()->get('created_at')??null; if ($dateTime){ $dateTime['start'] = strtotime($dateTime['start']); $dateTime['end'] = strtotime($dateTime['end']); }else{ $dateTime =['start'=>time()-(20*86400),'end'=>time()]; } $marketId = request()->get('market_id')??0; $card->tool(new \App\Admin\Actions\Tools\DataReportOrder('data_report',$marketId,$dateTime)); $card->content(OrderBar::make($this->orderData(['type'=>1,'market_id'=>$marketId,'date_time'=>$dateTime]))); $column->row($card); }); $row->column(4,function (Column $column){ $column->row(new Shipping($this->_shipping)); $column->row(new Distance($this->_distance,count($this->_number)));
$column->row(new \App\Admin\Actions\Metrics\Market($this->_market)); }); }); }
/** * 订单数据 * @param array $params * @return array[]|string[] */ public function orderData($params=[]) { $where['type'] = $params['type']; if ($params['market_id']>0){ $where['market_id'] = $params['market_id']; } $data = DB::table('lanzu_order_main') ->select('money') ->selectRaw("FROM_UNIXTIME(created_at,'%Y-%m-%d') as add_time") ->whereIn('state', [3, 4, 5, 10,11]) ->where($where) ->whereBetween('created_at',$params['date_time']) ->get(); $time = $num = $amount = []; if ($data){ $data = $data->groupBy('add_time')->toArray(); foreach ($data as $key=>$val){ $time[] = $key; $num[] = intval(count($val)); $amount[] = sprintf("%.2f",array_sum(array_column($val,'money'))); } return ['time'=>$time,'num'=>$num,'amount'=>$amount]; } return ['time'=>'','num'=>'','amount'=>''];
}
public function getOrderData() {
}
}
|