链街Dcat后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

225 lines
9.3 KiB

<?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()
{
}
}