Browse Source

Merge remote-tracking branch 'origin/develop' into develop

develop
李可松 4 years ago
parent
commit
ff853aef5b
  1. 18
      app/Admin/Controllers/HomeController.php
  2. 13
      app/Admin/Metrics/Examples/Dashboard.php
  3. 27
      app/Admin/Metrics/Examples/NewDevices.php
  4. 75
      app/Admin/Metrics/Examples/NewUsers.php
  5. 160
      app/Admin/Metrics/Examples/OrderExamples.php
  6. 87
      app/Admin/Metrics/Examples/ProductOrders.php
  7. 177
      app/Admin/Metrics/Examples/SalesExamples.php
  8. 2
      app/AdminAgent/Metrics/Examples/NewDevices.php
  9. 3
      app/AdminAgent/Metrics/Examples/OrderExamples.php
  10. 86
      app/AdminAgent/Metrics/Examples/ProductOrders.php
  11. 6
      app/AdminAgent/Metrics/Examples/SalesExamples.php
  12. 18
      app/AdminSupplier/Controllers/HomeController.php
  13. 13
      app/AdminSupplier/Metrics/Examples/Dashboard.php
  14. 45
      app/AdminSupplier/Metrics/Examples/NewDevices.php
  15. 71
      app/AdminSupplier/Metrics/Examples/NewUsers.php
  16. 168
      app/AdminSupplier/Metrics/Examples/OrderExamples.php
  17. 101
      app/AdminSupplier/Metrics/Examples/ProductOrders.php
  18. 180
      app/AdminSupplier/Metrics/Examples/SalesExamples.php
  19. 12
      app/Models/OrderProductItem.php
  20. 43
      resources/views/admin/pages/admin-home.blade.php
  21. 2
      resources/views/admin/pages/agent-home.blade.php
  22. 43
      resources/views/admin/pages/supplier-home.blade.php

18
app/Admin/Controllers/HomeController.php

@ -4,7 +4,7 @@ namespace App\Admin\Controllers;
use App\Admin\Metrics\Examples;
use App\Http\Controllers\Controller;
use Dcat\Admin\Http\Controllers\Dashboard;
use Dcat\Admin\Admin;
use Dcat\Admin\Layout\Column;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Layout\Row;
@ -13,13 +13,23 @@ class HomeController extends Controller
{
public function index(Content $content)
{
Admin::style(
<<<CSS
.col-sm-10.d-flex{
display: inline-block !important;
}
.col-sm-9.d-flex{
display: inline-block !important;
}
CSS
);
return $content
->header('仪表盘')
->description('数据详情')
->body(function (Row $row) {
$row->column(6, function (Column $column) {
$column->row(Dashboard::title());
$column->row(new Examples\Tickets());
$column->row(Examples\Dashboard::title());
$column->row(new Examples\OrderExamples());
});
$row->column(6, function (Column $column) {
@ -28,7 +38,7 @@ class HomeController extends Controller
$row->column(6, new Examples\NewDevices());
});
$column->row(new Examples\Sessions());
$column->row(new Examples\SalesExamples());
$column->row(new Examples\ProductOrders());
});
});

13
app/Admin/Metrics/Examples/Dashboard.php

@ -0,0 +1,13 @@
<?php
namespace App\Admin\Metrics\Examples;
use Dcat\Admin\Admin;
class Dashboard
{
public static function title()
{
return view('admin::pages.admin-home', ['admin' => Admin::user()]);
}
}

27
app/Admin/Metrics/Examples/NewDevices.php

@ -2,12 +2,15 @@
namespace App\Admin\Metrics\Examples;
use App\Models\Agent;
use App\Models\Guide;
use App\Models\Supplier;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Donut;
class NewDevices extends Donut
{
protected $labels = ['Desktop', 'Mobile'];
protected $labels = ['代理商', '供应商', '地接'];
/**
* 初始化卡片内容
@ -17,10 +20,9 @@ class NewDevices extends Donut
parent::init();
$color = Admin::color();
$colors = [$color->primary(), $color->alpha('blue2', 0.5)];
$colors = [$color->primary(), $color->alpha('blue2', 0.5),Admin::color()->yellow()];
$this->title('New Devices');
$this->subTitle('Last 30 days');
$this->title('入驻比例');;
$this->chartLabels($this->labels);
// 设置图表颜色
$this->chartColors($colors);
@ -45,10 +47,13 @@ class NewDevices extends Donut
*/
public function fill()
{
$this->withContent(44.9, 28.6);
$agent = Agent::query()->count();
$supplier = Supplier::query()->count();
$guide = Guide::query()->count();
$this->withContent($agent, $supplier, $guide);
// 图表数据
$this->withChart([44.9, 28.6]);
$this->withChart([$agent, $supplier, $guide]);
}
/**
@ -73,10 +78,10 @@ class NewDevices extends Donut
*
* @return $this
*/
protected function withContent($desktop, $mobile)
protected function withContent($desktop, $mobile, $unkonw)
{
$blue = Admin::color()->alpha('blue2', 0.5);
$yellow = Admin::color()->yellow();
$style = 'margin-bottom: 8px';
$labelWidth = 120;
@ -94,6 +99,12 @@ class NewDevices extends Donut
</div>
<div>{$mobile}</div>
</div>
<div class="d-flex pl-1 pr-1" style="{$style}">
<div style="width: {$labelWidth}px">
<i class="fa fa-circle" style="color: $yellow"></i> {$this->labels[2]}
</div>
<div>{$unkonw}</div>
</div>
HTML
);
}

75
app/Admin/Metrics/Examples/NewUsers.php

@ -2,8 +2,14 @@
namespace App\Admin\Metrics\Examples;
use App\Common\DataTime;
use App\Models\User;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class NewUsers extends Line
{
@ -16,12 +22,12 @@ class NewUsers extends Line
{
parent::init();
$this->title('New Users');
$this->title('新增用户');
$this->dropdown([
'7' => 'Last 7 Days',
'28' => 'Last 28 Days',
'30' => 'Last Month',
'365' => 'Last Year',
//'day' => '本日',
'week' => '本周',
'month' => '本月',
//'year' => '今年',
]);
}
@ -34,38 +40,43 @@ class NewUsers extends Line
*/
public function handle(Request $request)
{
$generator = function ($len, $min = 10, $max = 300) {
for ($i = 0; $i <= $len; $i++) {
yield mt_rand($min, $max);
}
};
$count = User::query();
$user = User::query()
->select('*')
->addSelect(DB::raw("COUNT(id) as count_id,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time"));
switch ($request->get('option')) {
case '365':
// 卡片内容
$this->withContent(mt_rand(1000, 5000).'k');
// 图表数据
$this->withChart(collect($generator(30))->toArray());
case 'day':
$count->whereDate('created_at', Carbon::today());
$user->whereDate('created_at', Carbon::today());
break;
case '30':
// 卡片内容
$this->withContent(mt_rand(400, 1000).'k');
// 图表数据
$this->withChart(collect($generator(30))->toArray());
case 'week':
$time = DataTime::beginAndEnd('week');
$count->whereBetween('created_at', $time);
$user->whereBetween('created_at', $time);
break;
case '28':
// 卡片内容
$this->withContent(mt_rand(400, 1000).'k');
// 图表数据
$this->withChart(collect($generator(28))->toArray());
case 'month':
$count->whereMonth('created_at', Carbon::now()->month);
$user->whereMonth('created_at', Carbon::now()->month);
break;
case 'year':
$count->whereYear('created_at', Carbon::now()->year);
$user->whereYear('created_at', Carbon::now()->year);
break;
case '7':
default:
// 卡片内容
$this->withContent('89.2k');
// 图表数据
$this->withChart([28, 40, 36, 52, 38, 60, 55,]);
$time = DataTime::beginAndEnd('week');
$count->whereBetween('created_at', $time);
$user->whereBetween('created_at', $time);
}
$user = $user->where('agent_id', Admin::user()->id)
->limit(30)
->groupBy('statistics_time')
->get()
->toArray();
$count = $count->count();
$this->withContent($count);
// 图表数据
$this->chartLabels(Arr::pluck($user, 'statistics_time'));
$this->withChart(Arr::pluck($user, 'count_id'));
}
/**
@ -73,7 +84,7 @@ class NewUsers extends Line
*
* @param array $data
*
* @return $this
* @return \App\Admin\Metrics\Examples\NewUsers
*/
public function withChart(array $data)
{

160
app/Admin/Metrics/Examples/OrderExamples.php

@ -0,0 +1,160 @@
<?php
namespace App\Admin\Metrics\Examples;
use App\Common\OrderStatus;
use App\Models\Order;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\RadialBar;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class OrderExamples extends RadialBar
{
/**
* 初始化卡片内容
*/
protected function init()
{
parent::init();
$this->title('订单统计');
$this->height(400);
$this->chartHeight(300);
}
/**
* 处理请求
*
* @param Request $request
*
* @return mixed|void
*/
public function handle(Request $request)
{
//总订单数
$count = Order::query()->count();
// 卡片内容
$this->withContent($count);
// 卡片底部
//今日订单
$countToday = Order::query()->whereDate('created_at',Carbon::today())->count();
$countYesterday = Order::query()->whereDate('created_at',Carbon::yesterday())->count();
$price = Order::query()->where('status',OrderStatus::SUCCESS)->whereDate('created_at',Carbon::today())->sum('price');
$this->withFooter($countToday, $countYesterday, $price);
$order = Order::query()
->select('*')
->addSelect(DB::raw("COUNT(id) as count_id,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time"))
->limit(30)
->orderBy('created_at', 'asc')
->groupBy('statistics_time')
->get()
->toArray();
$categories = Arr::pluck($order,'statistics_time');
// 图表数据
$data = Arr::pluck($order,'count_id');
$this->withChart($data,$categories);
}
/**
* 设置图表数据.
*
* @param int $data
*
* @return $this
*/
public function withChart(array $data,array $categories)
{
return $this->chart([
'series' => [
[
'name' => '订单量',
'data' => $data
]
],
'chart' => [
'type' => 'line',
'zoom' => [
'enabled' => false
],
'toolbar' => [
'show' => false
],
],
'colors' => [
Admin::color()->green(),
],
'dataLabels' => [
'enabled' => false
],
'stroke' => [
'curve' => 'smooth'
],
'legend' => [
'position' =>'top',
//'horizontalAlign' => 'right'
],
'fill' => [
'opacity' => 1,
'type' => 'solid',
],
'xaxis' => [
'categories' => $categories,
]
]);
}
/**
* 卡片内容
*
* @param string $content
*
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex flex-column flex-wrap text-left p-1">
<h1 class="font-lg-2 mt-2 mb-0">{$content}</h1>
<small>总订单数</small>
</div>
HTML
);
}
/**
* 卡片底部内容.
*
* @param string $new
* @param string $open
* @param string $response
*
* @return $this
*/
public function withFooter($new, $open, $response)
{
return $this->footer(
<<<HTML
<div class="d-flex justify-content-between p-1" style="padding-top: 0!important;">
<div class="text-center">
<p>今日订单</p>
<span class="font-lg-1">{$new}</span>
</div>
<div class="text-center">
<p>昨日订单</p>
<span class="font-lg-1">{$open}</span>
</div>
<div class="text-center">
<p>今日成交()</p>
<span class="font-lg-1">{$response}</span>
</div>
</div>
HTML
);
}
}

87
app/Admin/Metrics/Examples/ProductOrders.php

@ -2,6 +2,11 @@
namespace App\Admin\Metrics\Examples;
use App\Common\DataTime;
use App\Common\OrderStatus;
use App\Models\Order;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Round;
use Illuminate\Http\Request;
@ -14,13 +19,13 @@ class ProductOrders extends Round
{
parent::init();
$this->title('Product Orders');
$this->title('订单状态统计');
$this->chartLabels(['Finished', 'Pending', 'Rejected']);
$this->dropdown([
'7' => 'Last 7 Days',
'28' => 'Last 28 Days',
'30' => 'Last Month',
'365' => 'Last Year',
//'day' => '本日',
'week' => '本周',
'month' => '本月',
'year' => '今年',
]);
}
@ -33,21 +38,69 @@ class ProductOrders extends Round
*/
public function handle(Request $request)
{
$orders = Order::query()
->whereIn('status',[
OrderStatus::PAY_EARNEST,
OrderStatus::PAID,
OrderStatus::PAID_RETAINAGE,
OrderStatus::OFFLINE_PAID,
OrderStatus::SUCCESS
]);
switch ($request->get('option')) {
case '365':
case '30':
case '28':
case '7':
case 'day':
$orders->whereDate('created_at', Carbon::today());
break;
case 'week':
$time = DataTime::beginAndEnd('week');
$orders->whereBetween('created_at', $time);
break;
case 'month':
$orders->whereMonth('created_at', Carbon::now()->month);
break;
case 'year':
$orders->whereYear('created_at', Carbon::now()->year);
break;
default:
$time = DataTime::beginAndEnd('week');
$orders->whereBetween('created_at', $time);
}
$orders = $orders->pluck('status')->toArray();
$payEarnest = $pay = $success = 0;
$arr = [
OrderStatus::PAID,
OrderStatus::PAID_RETAINAGE,
OrderStatus::OFFLINE_PAID,
];
$count = count($orders);
if ($orders > 0) {
foreach ($orders as $status) {
if ($status == OrderStatus::PAY_EARNEST) {
$payEarnest++;
} elseif (in_array($status,$arr)) {
$pay++;
} elseif ($status == OrderStatus::SUCCESS) {
$success++;
}
}
}
// 卡片内容
$this->withContent(23043, 14658, 4758);
$this->withContent($payEarnest, $pay, $success);
$payEarnestPer = $count > 0 ? bcdiv($payEarnest,$count,2) * 100 : 0;
$payPer = $count > 0 ? bcdiv($pay,$count,2) * 100 : 0;
$successPer = $count > 0 ? bcdiv($success,$count,2) * 100 : 0;
// 图表数据
$this->withChart([70, 52, 26]);
$this->withChart([$payEarnestPer, $payPer, $successPer]);
// 总数
$this->chartTotal('Total', 344);
}
$this->chartTotal('总计', $count);
}
/**
@ -55,7 +108,7 @@ class ProductOrders extends Round
*
* @param array $data
*
* @return $this
* @return \App\Admin\Metrics\Examples\ProductOrders
*/
public function withChart(array $data)
{
@ -81,7 +134,7 @@ class ProductOrders extends Round
<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">Finished</span>
<span class="text-bold-600 ml-50">已付定金</span>
</div>
<div class="product-result">
<span>{$finished}</span>
@ -91,7 +144,7 @@ class ProductOrders extends Round
<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">Pending</span>
<span class="text-bold-600 ml-50">已付款</span>
</div>
<div class="product-result">
<span>{$pending}</span>
@ -101,7 +154,7 @@ class ProductOrders extends Round
<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">Rejected</span>
<span class="text-bold-600 ml-50">已完成</span>
</div>
<div class="product-result">
<span>{$rejected}</span>

177
app/Admin/Metrics/Examples/SalesExamples.php

@ -0,0 +1,177 @@
<?php
namespace App\Admin\Metrics\Examples;
use App\Common\OrderStatus;
use App\Models\Order;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Bar;
use Illuminate\Support\Facades\DB;
class SalesExamples extends Bar
{
protected $labels = [];
protected $colors;
/**
* 初始化卡片内容
*/
protected function init()
{
parent::init();
$color = Admin::color();
$this->colors = [$color->green(), $color->red(), $color->yellow(), $color->orange1(), $color->dark90(), $color->dark70(), $color->custom()];
$this->contentWidth(3, 9);
$this->title('销售排行');
//$this->chartPullRight = false;
//$this->subTitle('Last 30 days');
$this->height = 280;
$this->chartHeight = 250;
// 设置图表颜色
$this->chartColors($this->colors);
}
/**
* 渲染模板
*
* @return string
*/
public function render()
{
$this->fill();
return parent::render();
}
/**
* 写入数据.
*
* @return void
*/
public function fill()
{
$warehouse = Order::query()
->with('agentProduct')
->select('*')
->addSelect(DB::raw('count(id) as count_id'))
->where([
'status' => OrderStatus::SUCCESS,
])
->orderByDesc('count_id')
->groupBy('agent_product_id')
->limit(5)
->get();
//$warehouse = [];
$data = $categories = [];
foreach ($warehouse as $v) {
array_push($this->labels, $v->title);
array_push($data, $v->count_id);
$categories[] = [$v->title];
}
$this->withChart($data, $categories);
//$this->chartLabels($this->labels);
$count = Order::query()
->where([
'status' => OrderStatus::SUCCESS,
])
->count();
//$count = 0;
if ($count > 0) {
array_unshift($data, $count);
array_unshift($this->labels, '总销售量');
$color = Admin::color();
array_unshift($this->colors, $color->primary());
}
$this->withContent($data);
}
/**
* 设置图表数据.
*
* @param array $data
*
* @return $this
*/
public function withChart($data, $categories)
{
return $this->chart([
'series' => [[
'name' => '销量',
'data' => $data
]],
'chart' => [
//'width' => '180%',
'type' => 'bar',
'events' => [
],
'toolbar' => ['show' => false],
],
'colors' => $this->colors,
'plotOptions' => [
'bar' => [
//'columnWidth' => '45%',
'distributed' => true,
]
],
'dataLabels' => [
'enabled' => false
],
'legend' => [
'show' => false
],
'xaxis' => [
'categories' =>
$categories
,
'labels' => [
'show' => false,
'style' => [
'colors' => $this->colors,
'fontSize' => '12px'
]
],
],
'yaxis' => [
'show' => false
],
'tooltip' => [
'x' => ['show' => true],
],
]);
}
/**
* 设置卡片头部内容.
*
* @param mixed $desktop
* @param mixed $mobile
*
* @return $this
*/
protected function withContent($data)
{
$content = '';
foreach ($data as $k => $v) {
$content .= '
<div class="d-flex pl-1 mt-2">
<div style="width:100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
<i class="fa fa-circle" style="color:' . $this->colors[$k] . '"></i> ' . $this->labels[$k] . '
<div style="display:inline-block">' . $v . '</div>
</div>
</div>
';
}
return $this->content(
<<<HTML
$content
HTML
);
}
}

2
app/AdminAgent/Metrics/Examples/NewDevices.php

@ -19,7 +19,7 @@ class NewDevices extends Donut
parent::init();
$color = Admin::color();
$colors = [$color->primary(), $color->alpha('blue2', 0.5)];
$colors = [$color->primary(), $color->alpha('blue2', 0.5),Admin::color()->yellow()];
$this->title('用户性别');;
$this->chartLabels($this->labels);

3
app/AdminAgent/Metrics/Examples/OrderExamples.php

@ -2,6 +2,7 @@
namespace App\AdminAgent\Metrics\Examples;
use App\Common\OrderStatus;
use App\Models\Order;
use Carbon\Carbon;
use Dcat\Admin\Admin;
@ -41,7 +42,7 @@ class OrderExamples extends RadialBar
//今日订单
$countToday = Order::query()->where('agent_id',Admin::user()->id)->whereDate('created_at',Carbon::today())->count();
$countYesterday = Order::query()->where('agent_id',Admin::user()->id)->whereDate('created_at',Carbon::yesterday())->count();
$price = Order::query()->where('agent_id',Admin::user()->id)->whereDate('created_at',Carbon::today())->sum('price');
$price = Order::query()->where('agent_id',Admin::user()->id)->where('status',OrderStatus::SUCCESS)->whereDate('created_at',Carbon::today())->sum('price');
$this->withFooter($countToday, $countYesterday, $price);
$order = Order::query()
->select('*')

86
app/AdminAgent/Metrics/Examples/ProductOrders.php

@ -2,6 +2,11 @@
namespace App\AdminAgent\Metrics\Examples;
use App\Common\DataTime;
use App\Common\OrderStatus;
use App\Models\Order;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Round;
use Illuminate\Http\Request;
@ -14,13 +19,13 @@ class ProductOrders extends Round
{
parent::init();
$this->title('Product Orders');
$this->title('订单状态统计');
$this->chartLabels(['Finished', 'Pending', 'Rejected']);
$this->dropdown([
'7' => 'Last 7 Days',
'28' => 'Last 28 Days',
'30' => 'Last Month',
'365' => 'Last Year',
//'day' => '本日',
'week' => '本周',
'month' => '本月',
'year' => '今年',
]);
}
@ -33,21 +38,70 @@ class ProductOrders extends Round
*/
public function handle(Request $request)
{
$orders = Order::query()
->where('agent_id', Admin::user()->id)
->whereIn('status',[
OrderStatus::PAY_EARNEST,
OrderStatus::PAID,
OrderStatus::PAID_RETAINAGE,
OrderStatus::OFFLINE_PAID,
OrderStatus::SUCCESS
]);
switch ($request->get('option')) {
case '365':
case '30':
case '28':
case '7':
case 'day':
$orders->whereDate('created_at', Carbon::today());
break;
case 'week':
$time = DataTime::beginAndEnd('week');
$orders->whereBetween('created_at', $time);
break;
case 'month':
$orders->whereMonth('created_at', Carbon::now()->month);
break;
case 'year':
$orders->whereYear('created_at', Carbon::now()->year);
break;
default:
$time = DataTime::beginAndEnd('week');
$orders->whereBetween('created_at', $time);
}
$orders = $orders->pluck('status')->toArray();
$payEarnest = $pay = $success = 0;
$arr = [
OrderStatus::PAID,
OrderStatus::PAID_RETAINAGE,
OrderStatus::OFFLINE_PAID,
];
$count = count($orders);
if ($orders > 0) {
foreach ($orders as $status) {
if ($status == OrderStatus::PAY_EARNEST) {
$payEarnest++;
} elseif (in_array($status,$arr)) {
$pay++;
} elseif ($status == OrderStatus::SUCCESS) {
$success++;
}
}
}
// 卡片内容
$this->withContent(23043, 14658, 4758);
$this->withContent($payEarnest, $pay, $success);
$payEarnestPer = $count > 0 ? bcdiv($payEarnest,$count,2) * 100 : 0;
$payPer = $count > 0 ? bcdiv($pay,$count,2) * 100 : 0;
$successPer = $count > 0 ? bcdiv($success,$count,2) * 100 : 0;
// 图表数据
$this->withChart([70, 52, 26]);
$this->withChart([$payEarnestPer, $payPer, $successPer]);
// 总数
$this->chartTotal('Total', 344);
}
$this->chartTotal('总计', $count);
}
/**
@ -81,7 +135,7 @@ class ProductOrders extends Round
<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">Finished</span>
<span class="text-bold-600 ml-50">已付定金</span>
</div>
<div class="product-result">
<span>{$finished}</span>
@ -91,7 +145,7 @@ class ProductOrders extends Round
<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">Pending</span>
<span class="text-bold-600 ml-50">已付款</span>
</div>
<div class="product-result">
<span>{$pending}</span>
@ -101,7 +155,7 @@ class ProductOrders extends Round
<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">Rejected</span>
<span class="text-bold-600 ml-50">已完成</span>
</div>
<div class="product-result">
<span>{$rejected}</span>

6
app/AdminAgent/Metrics/Examples/SalesExamples.php

@ -57,7 +57,7 @@ class SalesExamples extends Bar
->select('*')
->addSelect(DB::raw('count(id) as count_id'))
->where([
//'status' => OrderStatus::SUCCESS,
'status' => OrderStatus::SUCCESS,
'agent_id' => Admin::user()->id,
])
->orderByDesc('count_id')
@ -77,7 +77,7 @@ class SalesExamples extends Bar
$count = Order::query()
->where([
//'status' => OrderStatus::SUCCESS,
'status' => OrderStatus::SUCCESS,
'agent_id' => Admin::user()->id,
])
->count();
@ -103,7 +103,7 @@ class SalesExamples extends Bar
return $this->chart([
'series' => [[
'name' => '出库数量',
'name' => '量',
'data' => $data
]],
'chart' => [

18
app/AdminSupplier/Controllers/HomeController.php

@ -4,7 +4,7 @@ namespace App\AdminSupplier\Controllers;
use App\AdminSupplier\Metrics\Examples;
use App\Http\Controllers\Controller;
use Dcat\Admin\Http\Controllers\Dashboard;
use Dcat\Admin\Admin;
use Dcat\Admin\Layout\Column;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Layout\Row;
@ -13,13 +13,23 @@ class HomeController extends Controller
{
public function index(Content $content)
{
Admin::style(
<<<CSS
.col-sm-10.d-flex{
display: inline-block !important;
}
.col-sm-9.d-flex{
display: inline-block !important;
}
CSS
);
return $content
->header('仪表盘')
->description('数据详情')
->body(function (Row $row) {
$row->column(6, function (Column $column) {
$column->row(Dashboard::title());
$column->row(new Examples\Tickets());
$column->row(Examples\Dashboard::title());
$column->row(new Examples\OrderExamples());
});
$row->column(6, function (Column $column) {
@ -28,7 +38,7 @@ class HomeController extends Controller
$row->column(6, new Examples\NewDevices());
});
$column->row(new Examples\Sessions());
$column->row(new Examples\SalesExamples());
$column->row(new Examples\ProductOrders());
});
});

13
app/AdminSupplier/Metrics/Examples/Dashboard.php

@ -0,0 +1,13 @@
<?php
namespace App\AdminSupplier\Metrics\Examples;
use Dcat\Admin\Admin;
class Dashboard
{
public static function title()
{
return view('admin::pages.supplier-home', ['admin' => Admin::user()]);
}
}

45
app/AdminSupplier/Metrics/Examples/NewDevices.php

@ -2,12 +2,15 @@
namespace App\AdminSupplier\Metrics\Examples;
use App\Common\AgentType;
use App\Common\ProductStatus;
use App\Models\Agent as AgentModel;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Donut;
class NewDevices extends Donut
{
protected $labels = ['Desktop', 'Mobile'];
protected $labels = [];
/**
* 初始化卡片内容
@ -15,12 +18,11 @@ class NewDevices extends Donut
protected function init()
{
parent::init();
$this->labels = array_values(AgentType::array());
$color = Admin::color();
$colors = [$color->primary(), $color->alpha('blue2', 0.5)];
$colors = [$color->primary(), $color->alpha('blue2', 0.5),Admin::color()->yellow()];
$this->title('New Devices');
$this->subTitle('Last 30 days');
$this->title('代理商类型');;
$this->chartLabels($this->labels);
// 设置图表颜色
$this->chartColors($colors);
@ -45,10 +47,28 @@ class NewDevices extends Donut
*/
public function fill()
{
$this->withContent(44.9, 28.6);
$agent = AgentModel::whereHas('agentProduct', function($query) {
//只统计在售产品的代理商
return $query->where('status', ProductStatus::ON_SALE)
->whereHas('product', function ($query) {
return $query->where(['supplier_id' => Admin::user()->id, 'status' => ProductStatus::ON_SALE]);
});
});
$agent = $agent->pluck('type');
$operator = $supplier = $cluster = 0;
foreach ($agent as $v) {
if ($v == AgentType::OPERATOR) {
$operator++;
} elseif ($v == AgentType::SUPPLIER) {
$supplier++;
} elseif($v == AgentType::CLUSTER) {
$cluster++;
}
}
$this->withContent($operator, $supplier, $cluster);
// 图表数据
$this->withChart([44.9, 28.6]);
$this->withChart([$operator,$supplier, $cluster]);
}
/**
@ -65,6 +85,7 @@ class NewDevices extends Donut
]);
}
/**
* 设置卡片头部内容.
*
@ -73,10 +94,10 @@ class NewDevices extends Donut
*
* @return $this
*/
protected function withContent($desktop, $mobile)
protected function withContent($desktop, $mobile, $unkonw)
{
$blue = Admin::color()->alpha('blue2', 0.5);
$yellow = Admin::color()->yellow();
$style = 'margin-bottom: 8px';
$labelWidth = 120;
@ -94,6 +115,12 @@ class NewDevices extends Donut
</div>
<div>{$mobile}</div>
</div>
<div class="d-flex pl-1 pr-1" style="{$style}">
<div style="width: {$labelWidth}px">
<i class="fa fa-circle" style="color: $yellow"></i> {$this->labels[2]}
</div>
<div>{$unkonw}</div>
</div>
HTML
);
}

71
app/AdminSupplier/Metrics/Examples/NewUsers.php

@ -2,8 +2,15 @@
namespace App\AdminSupplier\Metrics\Examples;
use App\Common\DataTime;
use App\Models\OrderProductItem;
use App\Models\User;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class NewUsers extends Line
{
@ -16,12 +23,12 @@ class NewUsers extends Line
{
parent::init();
$this->title('New Users');
$this->title('现金流水');
$this->dropdown([
'7' => 'Last 7 Days',
'28' => 'Last 28 Days',
'30' => 'Last Month',
'365' => 'Last Year',
//'day' => '本日',
'week' => '本周',
'month' => '本月',
//'year' => '今年',
]);
}
@ -34,38 +41,40 @@ class NewUsers extends Line
*/
public function handle(Request $request)
{
$generator = function ($len, $min = 10, $max = 300) {
for ($i = 0; $i <= $len; $i++) {
yield mt_rand($min, $max);
}
};
$order = OrderProductItem::query()
->where('supplier_id',Admin::user()->id);
switch ($request->get('option')) {
case '365':
// 卡片内容
$this->withContent(mt_rand(1000, 5000).'k');
// 图表数据
$this->withChart(collect($generator(30))->toArray());
case 'day':
$order->whereDate('created_at', Carbon::today());
break;
case '30':
// 卡片内容
$this->withContent(mt_rand(400, 1000).'k');
// 图表数据
$this->withChart(collect($generator(30))->toArray());
case 'week':
$time = DataTime::beginAndEnd('week');
$order->whereBetween('created_at', $time);
break;
case '28':
// 卡片内容
$this->withContent(mt_rand(400, 1000).'k');
// 图表数据
$this->withChart(collect($generator(28))->toArray());
case 'month':
$order->whereMonth('created_at', Carbon::now()->month);
break;
case 'year':
$order->whereYear('created_at', Carbon::now()->year);
break;
case '7':
default:
// 卡片内容
$this->withContent('89.2k');
// 图表数据
$this->withChart([28, 40, 36, 52, 38, 60, 55,]);
$time = DataTime::beginAndEnd('week');
$order->whereBetween('created_at', $time);
}
$countOrder = clone $order;
$count = $order->sum('price');
$this->withContent($count);
$countOrder = $countOrder->select('*')
->addSelect(DB::raw("sum(price) as sum_price,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time"))
->limit(30)
->groupBy('statistics_time')
->get()
->toArray();
// 图表数据
$this->chartLabels(Arr::pluck($countOrder, 'statistics_time'));
$this->withChart(Arr::pluck($countOrder, 'sum_price'));
}
/**
@ -73,7 +82,7 @@ class NewUsers extends Line
*
* @param array $data
*
* @return $this
* @return \App\AdminSupplier\Metrics\Examples\NewUsers
*/
public function withChart(array $data)
{

168
app/AdminSupplier/Metrics/Examples/OrderExamples.php

@ -0,0 +1,168 @@
<?php
namespace App\AdminSupplier\Metrics\Examples;
use App\Common\OrderStatus;
use App\Models\Order;
use App\Models\OrderProductItem;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\RadialBar;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class OrderExamples extends RadialBar
{
/**
* 初始化卡片内容
*/
protected function init()
{
parent::init();
$this->title('订单统计');
$this->height(400);
$this->chartHeight(300);
}
/**
* 处理请求
*
* @param Request $request
*
* @return mixed|void
*/
public function handle(Request $request)
{
//总订单数
$count = OrderProductItem::query()->where('supplier_id',Admin::user()->id)->count();
// 卡片内容
$this->withContent($count);
// 卡片底部
//今日订单
$countToday = OrderProductItem::query()->where('supplier_id',Admin::user()->id)->whereDate('created_at',Carbon::today())->count();
$countYesterday = OrderProductItem::query()->where('supplier_id',Admin::user()->id)->whereDate('created_at',Carbon::yesterday())->count();
$price = OrderProductItem::query()
->where('supplier_id',Admin::user()->id)
->whereHas('order',function ($query) {
$query->where('status',OrderStatus::SUCCESS);
})
->whereDate('created_at',Carbon::today())
->sum('price');
$this->withFooter($countToday, $countYesterday, $price);
$order = OrderProductItem::query()
->select('*')
->addSelect(DB::raw("COUNT(id) as count_id,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time"))
->where('supplier_id',Admin::user()->id)
->limit(30)
->orderBy('created_at', 'asc')
->groupBy('statistics_time')
->get()
->toArray();
$categories = Arr::pluck($order,'statistics_time');
// 图表数据
$data = Arr::pluck($order,'count_id');
$this->withChart($data,$categories);
}
/**
* 设置图表数据.
*
* @param int $data
*
* @return $this
*/
public function withChart(array $data,array $categories)
{
return $this->chart([
'series' => [
[
'name' => '订单量',
'data' => $data
]
],
'chart' => [
'type' => 'line',
'zoom' => [
'enabled' => false
],
'toolbar' => [
'show' => false
],
],
'colors' => [
Admin::color()->green(),
],
'dataLabels' => [
'enabled' => false
],
'stroke' => [
'curve' => 'smooth'
],
'legend' => [
'position' =>'top',
//'horizontalAlign' => 'right'
],
'fill' => [
'opacity' => 1,
'type' => 'solid',
],
'xaxis' => [
'categories' => $categories,
]
]);
}
/**
* 卡片内容
*
* @param string $content
*
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex flex-column flex-wrap text-left p-1">
<h1 class="font-lg-2 mt-2 mb-0">{$content}</h1>
<small>总订单数</small>
</div>
HTML
);
}
/**
* 卡片底部内容.
*
* @param string $new
* @param string $open
* @param string $response
*
* @return $this
*/
public function withFooter($new, $open, $response)
{
return $this->footer(
<<<HTML
<div class="d-flex justify-content-between p-1" style="padding-top: 0!important;">
<div class="text-center">
<p>今日订单</p>
<span class="font-lg-1">{$new}</span>
</div>
<div class="text-center">
<p>昨日订单</p>
<span class="font-lg-1">{$open}</span>
</div>
<div class="text-center">
<p>今日成交()</p>
<span class="font-lg-1">{$response}</span>
</div>
</div>
HTML
);
}
}

101
app/AdminSupplier/Metrics/Examples/ProductOrders.php

@ -2,6 +2,12 @@
namespace App\AdminSupplier\Metrics\Examples;
use App\Common\DataTime;
use App\Common\OrderStatus;
use App\Models\Order;
use App\Models\OrderProductItem;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Round;
use Illuminate\Http\Request;
@ -14,13 +20,13 @@ class ProductOrders extends Round
{
parent::init();
$this->title('Product Orders');
$this->title('订单状态统计');
$this->chartLabels(['Finished', 'Pending', 'Rejected']);
$this->dropdown([
'7' => 'Last 7 Days',
'28' => 'Last 28 Days',
'30' => 'Last Month',
'365' => 'Last Year',
//'day' => '本日',
'week' => '本周',
'month' => '本月',
'year' => '今年',
]);
}
@ -33,21 +39,82 @@ class ProductOrders extends Round
*/
public function handle(Request $request)
{
$orders = OrderProductItem::query()
->with('product')
->where('supplier_id', Admin::user()->id);
switch ($request->get('option')) {
case '365':
case '30':
case '28':
case '7':
case 'day':
$orders->whereDate('created_at', Carbon::today());
break;
case 'week':
$time = DataTime::beginAndEnd('week');
$orders->whereBetween('created_at', $time);
break;
case 'month':
$orders->whereMonth('created_at', Carbon::now()->month);
break;
case 'year':
$orders->whereYear('created_at', Carbon::now()->year);
break;
default:
$time = DataTime::beginAndEnd('week');
$orders->whereBetween('created_at', $time);
}
$count = clone $orders;
$payEarnest = clone $orders;
$pay = clone $orders;
$success = clone $orders;
$payEarnest = $payEarnest->whereHas('order', function ($query) {
$query->whereIn('status', [
OrderStatus::PAY_EARNEST
]);
})
->count();
$pay = $pay->whereHas('order', function ($query) {
$query->whereIn('status',[
OrderStatus::PAID,
OrderStatus::PAID_RETAINAGE,
OrderStatus::OFFLINE_PAID,
]);
})
->count();
$success = $success->whereHas('order', function ($query) {
$query->whereIn('status', [
OrderStatus::SUCCESS
]);
})
->count();
$count = $count->whereHas('order', function ($query) {
$query->whereIn('status', [
OrderStatus::PAY_EARNEST,
OrderStatus::PAID,
OrderStatus::PAID_RETAINAGE,
OrderStatus::OFFLINE_PAID,
OrderStatus::SUCCESS
]);
})
->count();
// 卡片内容
$this->withContent(23043, 14658, 4758);
$this->withContent($payEarnest, $pay, $success);
$payEarnestPer = $count > 0 ? bcdiv($payEarnest, $count, 2) * 100 : 0;
$payPer = $count > 0 ? bcdiv($pay, $count, 2) * 100 : 0;
$successPer = $count > 0 ? bcdiv($success, $count, 2) * 100 : 0;
// 图表数据
$this->withChart([70, 52, 26]);
$this->withChart([$payEarnestPer, $payPer, $successPer]);
// 总数
$this->chartTotal('Total', 344);
}
$this->chartTotal('总计', $count);
}
/**
@ -55,7 +122,7 @@ class ProductOrders extends Round
*
* @param array $data
*
* @return $this
* @return \App\AdminSupplier\Metrics\Examples\ProductOrders
*/
public function withChart(array $data)
{
@ -81,7 +148,7 @@ class ProductOrders extends Round
<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">Finished</span>
<span class="text-bold-600 ml-50">已付定金</span>
</div>
<div class="product-result">
<span>{$finished}</span>
@ -91,7 +158,7 @@ class ProductOrders extends Round
<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">Pending</span>
<span class="text-bold-600 ml-50">已付款</span>
</div>
<div class="product-result">
<span>{$pending}</span>
@ -101,7 +168,7 @@ class ProductOrders extends Round
<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">Rejected</span>
<span class="text-bold-600 ml-50">已完成</span>
</div>
<div class="product-result">
<span>{$rejected}</span>

180
app/AdminSupplier/Metrics/Examples/SalesExamples.php

@ -0,0 +1,180 @@
<?php
namespace App\AdminSupplier\Metrics\Examples;
use App\Common\OrderStatus;
use App\Models\Order;
use App\Models\OrderProductItem;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Bar;
use Illuminate\Support\Facades\DB;
class SalesExamples extends Bar
{
protected $labels = [];
protected $colors;
/**
* 初始化卡片内容
*/
protected function init()
{
parent::init();
$color = Admin::color();
$this->colors = [$color->green(), $color->red(), $color->yellow(), $color->orange1(), $color->dark90(), $color->dark70(), $color->custom()];
$this->contentWidth(3, 9);
$this->title('销售排行');
//$this->chartPullRight = false;
//$this->subTitle('Last 30 days');
$this->height = 280;
$this->chartHeight = 250;
// 设置图表颜色
$this->chartColors($this->colors);
}
/**
* 渲染模板
*
* @return string
*/
public function render()
{
$this->fill();
return parent::render();
}
/**
* 写入数据.
*
* @return void
*/
public function fill()
{
$warehouse = OrderProductItem::query()
->with('product')
->select('*')
->addSelect(DB::raw('count(id) as count_id'))
->whereHas('order',function ($query) {
$query->where('status',OrderStatus::SUCCESS);
})
->where('supplier_id',Admin::user()->id)
->orderByDesc('count_id')
->groupBy('product_id')
->limit(5)
->get();
//$warehouse = [];
$data = $categories = [];
foreach ($warehouse as $v) {
array_push($this->labels, $v->product->title);
array_push($data, $v->count_id);
$categories[] = [$v->product->title];
}
$this->withChart($data, $categories);
//$this->chartLabels($this->labels);
$count = OrderProductItem::query()
->where('supplier_id',Admin::user()->id)
->whereHas('order',function ($query) {
$query->where('status',OrderStatus::SUCCESS);
})
->count();
//$count = 0;
if ($count > 0) {
array_unshift($data, $count);
array_unshift($this->labels, '总销售量');
$color = Admin::color();
array_unshift($this->colors, $color->primary());
}
$this->withContent($data);
}
/**
* 设置图表数据.
*
* @param array $data
*
* @return $this
*/
public function withChart($data, $categories)
{
return $this->chart([
'series' => [[
'name' => '销量',
'data' => $data
]],
'chart' => [
//'width' => '180%',
'type' => 'bar',
'events' => [
],
'toolbar' => ['show' => false],
],
'colors' => $this->colors,
'plotOptions' => [
'bar' => [
//'columnWidth' => '45%',
'distributed' => true,
]
],
'dataLabels' => [
'enabled' => false
],
'legend' => [
'show' => false
],
'xaxis' => [
'categories' =>
$categories
,
'labels' => [
'show' => false,
'style' => [
'colors' => $this->colors,
'fontSize' => '12px'
]
],
],
'yaxis' => [
'show' => false
],
'tooltip' => [
'x' => ['show' => true],
],
]);
}
/**
* 设置卡片头部内容.
*
* @param mixed $desktop
* @param mixed $mobile
*
* @return $this
*/
protected function withContent($data)
{
$content = '';
foreach ($data as $k => $v) {
$content .= '
<div class="d-flex pl-1 mt-2">
<div style="width:100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
<i class="fa fa-circle" style="color:' . $this->colors[$k] . '"></i> ' . $this->labels[$k] . '
<div style="display:inline-block">' . $v . '</div>
</div>
</div>
';
}
return $this->content(
<<<HTML
$content
HTML
);
}
}

12
app/Models/OrderProductItem.php

@ -13,6 +13,16 @@ class OrderProductItem extends BaseModel
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->timestamps = false;
//$this->timestamps = false;
}
function order()
{
return $this->belongsTo(Order::class,'order_id','id');
}
function product()
{
return $this->belongsTo(Product::class,'product_id','id');
}
}

43
resources/views/admin/pages/admin-home.blade.php

@ -0,0 +1,43 @@
<style>
.dashboard-title .links {
text-align: center;
margin-bottom: 2.5rem;
}
.dashboard-title .links > a {
padding: 0 25px;
font-size: 12px;
font-weight: 600;
letter-spacing: .1rem;
text-decoration: none;
text-transform: uppercase;
color: #fff;
}
.dashboard-title h1 {
font-weight: 200;
font-size: 2.5rem;
}
.dashboard-title .avatar {
background: #fff;
border: 2px solid #fff;
width: 70px;
height: 70px;
}
</style>
<div class="dashboard-title card bg-primary">
<div class="card-body">
<div class="text-center ">
<img class="avatar img-circle shadow mt-1" src="{{config('filesystems.disks.oss.cdnDomain').'/'.$admin->avatar}}">
<div class="text-center mb-1">
<h1 class="mb-3 mt-2 text-white">{{$admin->name}}</h1>
<div class="links">
<a href="{{ admin_url('/supplier/list') }}">供应商管理</a>
<a href="{{ admin_url('/agent/list') }}" id="doc-link">代理商管理</a>
<a href="{{ admin_url('/guide/list') }}" id="demo-link">地接管理</a>
<a href="{{ admin_url('/product/audit') }}" id="demo-link">产品审核</a>
</div>
</div>
</div>
</div>
</div>

2
resources/views/admin/pages/agent-home.blade.php

@ -32,7 +32,7 @@
<div class="text-center mb-1">
<h1 class="mb-3 mt-2 text-white">{{$admin->name}}</h1>
<div class="links">
<a href="{{ admin_url('/auth/users') }}">用户管理</a>
<a href="{{ admin_url('/user/list') }}">用户管理</a>
<a href="{{ admin_url('/order/list') }}" id="doc-link">订单管理</a>
<a href="{{ admin_url('/advertising/list') }}" id="demo-link">广告管理</a>
<a href="{{ admin_url('/product/list') }}" id="demo-link">产品管理</a>

43
resources/views/admin/pages/supplier-home.blade.php

@ -0,0 +1,43 @@
<style>
.dashboard-title .links {
text-align: center;
margin-bottom: 2.5rem;
}
.dashboard-title .links > a {
padding: 0 25px;
font-size: 12px;
font-weight: 600;
letter-spacing: .1rem;
text-decoration: none;
text-transform: uppercase;
color: #fff;
}
.dashboard-title h1 {
font-weight: 200;
font-size: 2.5rem;
}
.dashboard-title .avatar {
background: #fff;
border: 2px solid #fff;
width: 70px;
height: 70px;
}
</style>
<div class="dashboard-title card bg-primary">
<div class="card-body">
<div class="text-center ">
<img class="avatar img-circle shadow mt-1" src="{{config('filesystems.disks.oss.cdnDomain').'/'.$admin->avatar}}">
<div class="text-center mb-1">
<h1 class="mb-3 mt-2 text-white">{{$admin->name}}</h1>
<div class="links">
<a href="{{ admin_url('/agent/list') }}">代理商列表</a>
<a href="{{ admin_url('/auth/users') }}" id="doc-link">人员管理</a>
<a href="{{ admin_url('/order/list') }}" id="demo-link">订单管理</a>
<a href="{{ admin_url('/product/list') }}" id="demo-link">产品管理</a>
</div>
</div>
</div>
</div>
</div>
Loading…
Cancel
Save