Browse Source

数据报表

master
lanzu_qinsheng 5 years ago
parent
commit
20fd6955a7
  1. 137
      app/Admin/Actions/Metrics/Distance.php
  2. 99
      app/Admin/Actions/Metrics/Shipping.php
  3. 45
      app/Admin/Actions/Tools/DataReportDate.php
  4. 3
      app/Admin/Actions/Tools/DataReportOption.php
  5. 12
      app/Admin/Actions/Tools/DataReportOrder.php
  6. 21
      app/Admin/Common/Order.php
  7. 68
      app/Admin/Controllers/v3/DataReport.php

137
app/Admin/Actions/Metrics/Distance.php

@ -0,0 +1,137 @@
<?php
namespace App\Admin\Actions\Metrics;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Round;
class Distance extends Round
{
protected $distance;
protected $number;
public function __construct($distance, $number)
{
$this->distance = $distance;
$this->number = $number;
parent::__construct($title=null, $icon=null);
}
/**
* 初始化卡片内容
*/
protected function init()
{
parent::init();
$this->height = 160;
$this->style('padding-top:0');
$this->chartLabels(['1km以内', '1-3km', '3km以上']);
}
/**
* 渲染模板
*
* @return string
*/
public function render()
{
$this->fill();
Admin::script($this->script());
return parent::render();
}
public function script()
{
return <<<JS
$('#shipping').parent().parent().parent().parent().prev().addClass('pt-0');
JS;
}
/**
* 写入数据.
*
* @return void
*/
public function fill()
{
$this->withContent($this->distance[0], $this->distance[1],$this->distance[2]);
// 图表数据
$this->withChart([
$this->distance[0]>0?sprintf("%.2f",($this->distance[0]/$this->number)*100):0,
$this->distance[0]>0?sprintf("%.2f",($this->distance[1]/$this->number)*100):0,
$this->distance[0]>0?sprintf("%.2f",($this->distance[2]/$this->number)*100):0,
]);
// 总数
$this->chartTotal('总数', $this->number);
}
/**
* 设置图表数据.
*
* @param array $data
*
* @return $this
*/
public function withChart(array $data)
{
return $this->chart([
'series' => $data,
]);
}
/**
* 卡片内容.
*
* @param int $finished
* @param int $pending
* @param int $rejected
*
* @return $this
*/
public function withContent($d1, $d2, $d3)
{
return $this->content(
<<<HTML
<div class="col-12 d-flex flex-column flex-wrap text-center" id="shipping" style="max-width: 220px;">
<div class="chart-info d-flex justify-content-between mb-1 mt-2">
<div class="series-info d-flex align-items-center">
<i class="fa fa-circle-o text-bold-700 text-primary"></i>
<span class="text-bold-600 ml-50">1km以内</span>
</div>
<div class="product-result">
<span>{$d1}</span>
</div>
</div>
<div class="chart-info d-flex justify-content-between mb-1">
<div class="series-info d-flex align-items-center">
<i class="fa fa-circle-o text-bold-700 text-warning"></i>
<span class="text-bold-600 ml-50">1-3km</span>
</div>
<div class="product-result">
<span>{$d2}</span>
</div>
</div>
<div class="chart-info d-flex justify-content-between mb-1">
<div class="series-info d-flex align-items-center">
<i class="fa fa-circle-o text-bold-700 text-danger"></i>
<span class="text-bold-600 ml-50">3km以上</span>
</div>
<div class="product-result">
<span>{$d3}</span>
</div>
</div>
</div>
HTML
);
}
}

99
app/Admin/Actions/Metrics/Shipping.php

@ -0,0 +1,99 @@
<?php
namespace App\Admin\Actions\Metrics;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Donut;
class Shipping extends Donut
{
protected $labels = ['站内配送','用户自提'];
protected $shipping;
public function __construct($shipping)
{
$this->shipping = $shipping;
parent::__construct($title=null, $icon=null);
}
public function init()
{
parent::init(); // TODO: Change the autogenerated stub
$color = Admin::color();
$colors = [$color->primary(), $color->alpha('blue2', 0.5)];
//$this->title('<small>配送数据</small>');
$this->height = 150;
$this->chartLabels($this->labels);
// 设置图表颜色
$this->chartColors($colors);
}
/**
* 渲染模板
*
* @return string
*/
public function render()
{
$this->fill();
return parent::render(); // TODO: Change the autogenerated stub
}
/**
* 写入数据.
*
* @return void
*/
public function fill()
{
// 图表数据
$this->withChart($this->shipping);
$this->withContent($this->shipping[0], $this->shipping[1]);
}
/**
* 设置图表数据.
*
* @param array $data
*
* @return $this
*/
public function withChart(array $data)
{
return $this->chart([
'series' => $data
]);
}
/**
* 设置卡片头部内容.
*
* @param mixed $desktop
* @param mixed $mobile
*
* @return $this
*/
protected function withContent($s1, $s2)
{
$blue = Admin::color()->alpha('blue2', 0.5);
$style = 'margin-bottom: 8px';
$labelWidth = 120;
return $this->content(
<<<HTML
<div class="d-flex pl-1 pr-1 pt-1" style="{$style}">
<div style="width: {$labelWidth}px">
<i class="fa fa-circle text-primary"></i> {$this->labels[0]}
</div>
<div>{$s1}</div>
</div>
<div class="d-flex pl-1 pr-1" style="{$style}">
<div style="width: {$labelWidth}px">
<i class="fa fa-circle" style="color: $blue"></i> {$this->labels[1]}
</div>
<div>{$s2}</div>
</div>
HTML
);
}
}

45
app/Admin/Actions/Tools/DataReportDate.php

@ -21,14 +21,14 @@ class DataReportDate extends AbstractTool
protected function script()
{
$url = request()->fullUrl();
$path = request()->url();
if(!(request()->server('QUERY_STRING'))){
$url .= "?type=date&option=0";
}
$url = $path = request()->url();
$fullUrl = request()->fullUrl();
$date = request()->input('created_at');
$start = $date?$date['start']:'';
$end = $date?$date['end']:'';
if(!(request()->server('QUERY_STRING'))){
$fullUrl = $url .= "?type=today&option=1";
}
return <<<JS
var app= new Vue({
el:"#date_time",
@ -36,6 +36,7 @@ class DataReportDate extends AbstractTool
start: "$start",
end: "$end",
url:"$url",
full_url:"$fullUrl",
path:"$path",
pickerOptions: {
disabledDate(time) {
@ -65,23 +66,41 @@ class DataReportDate extends AbstractTool
},
methods:{
doSearch(){
var market_id = sessionStorage.getItem('market_id');
if (market_id==0&&!this.start&&!this.end){
this.\$message({message:'请选择查询市场或时间',type:"error"})
return false;
}
var url = this.url;
if (this.start){
url = url+"&created_at[start]="+this.start;
}else {
this.\$message({message:'请选择起始日期',type:'error'});
return false;
url = url+"?type=date&option=0&created_at[start]="+this.start;
}
if (this.end){
if (!this.start){
this.\$message({message:'请选择起始时间',type:"error"})
return false;
}
url = url+"&created_at[end]="+this.end;
}else {
this.\$message({message:'请选择截止日期',type:'error'});
return false;
if (this.start){
this.\$message({message:'请选择截止时间',type:"error"})
return false;
}
}
var market_id = sessionStorage.getItem('market_id');
if (market_id>0){
if (this.start&&this.end&&(this.start>this.end)){
this.\$message({message:'截止时间不能小于起始时间',type:"error"})
return false;
}
if (market_id>0&&!this.start&&!this.end){
url = this.full_url+"&market_id="+market_id;
}else {
url = url+"&market_id="+market_id;
}
window.location.href=url;
},
reset(){

3
app/Admin/Actions/Tools/DataReportOption.php

@ -23,13 +23,14 @@ class DataReportOption extends AbstractTool
protected function script()
{
$option = json_encode($this->option);
$market_id = request()->get('market_id',0);
return <<<JS
var options = JSON.stringify($option)
var app= new Vue({
el:"#option",
data:{
options: JSON.parse(options),
value: 0,
value: $market_id,
},
methods:{
doSomething(url){

12
app/Admin/Actions/Tools/DataReportOrder.php

@ -12,9 +12,13 @@ class DataReportOrder extends AbstractTool
protected $url;
protected $option;
protected $route;
public function __construct($route)
protected $dateTime;
protected $marketId;
public function __construct($route,$marketId,$dateTime)
{
$this->route = $route;
$this->dateTime = $dateTime;
$this->marketId = $marketId;
parent::__construct();
}
@ -42,9 +46,11 @@ JS;
'num' => '2',
];
$option = request()->get('option');
$this->dateTime['start'] = date('Y-m-d',$this->dateTime['start']);
$this->dateTime['end'] = date('Y-m-d',$this->dateTime['end']);
foreach ($data as $key=>$value){
$this->url = "{$this->route}?order_type={$key}&option={$value}&&name={$options[$key]}";
$this->url = "{$this->route}?order_type={$key}&option={$option}&name={$options[$key]}&market_id={$this->marketId}&created_at[start]={$this->dateTime['start']}&created_at[end]={$this->dateTime['end']}";
$this->option = $key;
Admin::script($this->script());
}

21
app/Admin/Common/Order.php

@ -47,17 +47,30 @@ class Order
$buildData = $buildData->whereBetween('created_at',[$beginTime,$endTime]);
}
}
if ($params['data_type']=='count_user'){
if ($params['data_type']=='count_user'){//用户数
$result = $buildData
->groupBy('lanzu_order_main.user_id')
->pluck('lanzu_order_main.user_id')
->toArray();
$result = count($result);
}elseif ($params['data_type']=='number'){
}elseif ($params['data_type']=='number'){//订单数
$result = $buildData->count();
}elseif ($params['data_type']=='amount'){
}elseif ($params['data_type']=='amount'){//订单金额
$result = $buildData->sum('money');
}elseif ($params['data_type']=='shipping'){//配送方式
$build1 = clone $buildData;
$build3 = clone $buildData;
$s1 = $build1->where('shipping_type',1)->count();
$s3 = $build3->where('shipping_type',3)->count();
$result = [$s1,$s3];
}elseif ($params['data_type']=='distance'){
$build1 = clone $buildData;
$build2 = clone $buildData;
$build3 = clone $buildData;
$d1 = $build1->where('delivery_distance','<',1000)->count();
$d2 = $build2->where('delivery_distance','>',[1000,3000])->count();
$d3 = $build3->where('delivery_distance','>',3000)->count();
$result = [$d1,$d2,$d3];
}
return $result;
}

68
app/Admin/Controllers/v3/DataReport.php

@ -5,6 +5,8 @@ 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;
@ -31,27 +33,44 @@ class DataReport
protected $_amount;
protected $_number;
protected $_count_user;
protected $_shipping;
protected $_distance;
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'=>'',//取哪个市场数据
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null
],$option);
$this->_number = Order::getOrderData([
'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'number',//取什么数据 data_type 数据类型
'market_id'=>'',//取哪个市场数据
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null
],$option);
$this->_count_user = Order::getOrderData([
'user_type'=>'market_service',//谁取数据 user_type 用户类型
'data_type'=>'count_user',//取什么数据 data_type 数据类型
'market_id'=>'',//取哪个市场数据
'market_id'=>$marketId,//取哪个市场数据
'condition'=>1,//取数据维度 condition
'user_ids'=>null
],$option);
$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);
@ -60,7 +79,7 @@ class DataReport
public function index(Content $content)
{
return $content
->header('数据统计')
->header('订单数据')
->body(function (Row $row){
$row->column(4,function (Column $column){
$column->row(new \App\Admin\Actions\Tools\DataReportTime('data_report'));
@ -84,19 +103,21 @@ class DataReport
})->body('<hr />')
->body(function (Row $row){
$row->column(2,function (Column $column){
$title = "订单总额(元)";
$value = $this->_amount;
$title = "订单";
$value = $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->_number;
$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;
@ -117,14 +138,14 @@ class DataReport
$column->row($card);
});
$row->column(2,function (Column $column){
$title = "有效用户总数";
$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 = "佣金收入(元)";
$title = "下过单的用户数";
$value = 0;
$card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>");
$card->style('background-color:#4e9876');
@ -135,19 +156,24 @@ class DataReport
$row->column(8,function (Column $column){
$card = new Card();
$card->title('订单图表');
$card->tool(new \App\Admin\Actions\Tools\DataReportOrder('data_report'));
$card->content(OrderBar::make($this->orderData(['type'=>1])));
//默认查询最近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){
$card1 = Card::make('1111');
$card1->style("height:162px");
$column->row($card1);
$card2 = Card::make('222');
$card2->style("height:162px");
$column->row($card2);
$column->row(new Shipping($this->_shipping));
$column->row(new Distance($this->_distance,$this->_number));
$card3 = Card::make('222');
$card3->style("height:162px");
$card3->style("height:155px");
$column->row($card3);
});
});
@ -161,10 +187,14 @@ class DataReport
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")
->where($where)
->whereBetween('created_at',$params['date_time'])
->get();
$time = $num = $amount = [];
if ($data){

Loading…
Cancel
Save