Browse Source

活动商品-添加导出功能,后台服务站用户权限

master
liangyuyan 5 years ago
parent
commit
e19e9d73de
  1. 65
      app/Admin/Actions/EXporter/GoodsActivitySales.php
  2. 84
      app/Admin/Actions/Tools/GoodsActivityExport.php
  3. 63
      app/Admin/Controllers/v3/GoodsActivityReportController.php
  4. 14
      app/Admin/Repositories/v3/GoodsActivityReport.php
  5. 6
      app/Admin/Widgets/Charts/OrderGoodsActivityCountChart.php
  6. 6
      app/Admin/Widgets/Charts/OrderGoodsActivityMarketChart.php
  7. 10
      app/Admin/Widgets/Charts/OrderGoodsActivityTotalChart.php
  8. 1
      app/Admin/routes.php

65
app/Admin/Actions/EXporter/GoodsActivitySales.php

@ -0,0 +1,65 @@
<?php
namespace App\Admin\Actions\Exporter;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
use App\Admin\Repositories\v3\GoodsActivityReport;
use App\Models\v3\Market as MarketModel;
use App\Models\v3\Store as StoreModel;
class GoodsActivitySales implements FromArray, WithStrictNullComparison
{
protected $params = [];
public function __construct($params)
{
$this->params = $params;
}
public function array(): array
{
$result = [[
'商品ID',
'商品名称',
'市场',
'店铺',
'售价(元)',
'原价(元)',
'销量(单)',
'补贴(元)',
]];
$data = $this->getData($this->params);
$markets = MarketModel::getMarketArray();
$stores = StoreModel::getStoreArray();
foreach ($data as $value){
$item = [
$value['goods_id'],
$value['name']??'',
$markets[$value['market_id']]??'',
$stores[$value['store_id']]??'',
$value['price']??0,
$value['original_price']??0,
$value['total']??0,
$value['subsidy_total']??0
];
$result[] = $item;
}
return $result;
}
/**
* 获取数据
*/
public function getData($option = [])
{
$params = $option;
$repository = new GoodsActivityReport();
$selects = 'SUM(number) as total,SUM((original_price-price)*number) as subsidy_total,price,original_price,lanzu_order_goods.goods_id,lanzu_order_goods.name,lanzu_order_goods.cover_img,lanzu_order_main.market_id,lanzu_order.store_id';
$orderGoodsActivity = $repository->getDataModel($selects,$params);
$list = $orderGoodsActivity->orderBy('total','desc')->groupBy('goods_id','lanzu_order_goods.name','cover_img','market_id','store_id','price','original_price')->get()->toArray();
return $list;
}
}

84
app/Admin/Actions/Tools/GoodsActivityExport.php

@ -0,0 +1,84 @@
<?php
namespace App\Admin\Actions\Tools;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Traits\HasPermissions;
use Dcat\Admin\Tree\AbstractTool;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class GoodsActivityExport extends AbstractTool
{
/**
* @return string
*/
protected $title = '<span class="feather icon-download">导出<span>';
/**
* Handle the action request.
*
* @param Request $request
*
* @return Response
*/
public function handle(Request $request)
{
$url = '/goods_activity_export?';
$name = $request->get('name', '');
$marketId = $request->get('market_id',0);
$storeId = $request->get('store_id',0);
$startTime = $request->get('start_time','');
$endTime = $request->get('end_time','');
if(!empty($name)){
$url .= '&name='.$name;
}
if(!empty($marketId)){
$url .= '&market_id='.$marketId;
}
if(!empty($storeId)){
$url .= '&store_id='.$storeId;
}
if(!empty($startTime)){
$url .= '&start_time='.$startTime;
}
if(!empty($endTime)){
$url .= '&end_time='.$endTime;
}
return $this->response()
->success('导出中~')
->redirect($url);
}
public function parameters()
{
return [
'page' => request()->input('page', 1),
'name' => request()->input('name', ''),
'market_id' => request()->input('market_id',0),
'store_id' => request()->input('store_id',0),
'start_time' => request()->input('start_time',''),
'end_time' => request()->input('end_time',''),
];
}
/**
* @return string|array|void
*/
public function confirm()
{
return '确定导出数据吗?';
}
/**
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return true;
}
}

63
app/Admin/Controllers/v3/GoodsActivityReportController.php

@ -3,7 +3,8 @@
namespace App\Admin\Controllers\v3;
use App\Admin\Actions\Grid\v3\DataReportOption;
use App\Admin\Actions\Tools\GoodsActivityExport;
use App\Admin\Common\Auth;
use App\Admin\Repositories\v3\GoodsActivityReport;
use App\Admin\Widgets\Charts\OrderGoodsActivityCountChart;
use App\Admin\Widgets\Charts\OrderGoodsActivityMarketChart;
@ -17,13 +18,16 @@ use Dcat\Admin\Grid\Filter;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Widgets\Card;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class GoodsActivityReportController extends AdminController
{
protected $GoodsActivityReport = null;
protected $marketId = 0;
protected $newParams = [];
public function __construct()
{
$this->GoodsActivityReport = new GoodsActivityReport();
}
/**
@ -33,10 +37,15 @@ class GoodsActivityReportController extends AdminController
*/
protected function grid()
{
return Grid::make($this->GoodsActivityReport, function (Grid $grid) {
$marketList = MarketModel::getMarketArray();
$storeList = StoreModel::getStoreArray();
return Grid::make(new GoodsActivityReport($this->newParams), function (Grid $grid) {
if($this->marketId){
$marketList = MarketModel::getMarketArray([['id','=',$this->marketId]]);
$storeList = StoreModel::getStoreArray([['market_id','=',$this->marketId]]);
}else{
$marketList = MarketModel::getMarketArray();
$storeList = StoreModel::getStoreArray();
}
$grid->column('goods_id')->sortable();
$grid->column('cover_img')->image('',50);
@ -44,11 +53,11 @@ class GoodsActivityReportController extends AdminController
$grid->column('market_id')->display(function($marketId){
$item = MarketModel::getMarketInfo($marketId,'name');
return empty($item) ? '' : $item->name;
return $item->name ?? '';
});
$grid->column('store_id')->display(function($storeId){
$item = StoreModel::getStoreInfo($storeId,'name');
return empty($item) ? '' : $item->name;
return $item->name ?? '';
})->width('12%');
$grid->column('price');
$grid->column('original_price');
@ -61,7 +70,9 @@ class GoodsActivityReportController extends AdminController
$filter->equal('start_time','开始时间')->date()->width(2);
$filter->equal('end_time','结束时间')->date()->width(2);
$filter->equal('name','商品名称')->width(3);
$filter->equal('market_id','市场')->select($marketList)->width(2);
if(!$this->marketId){
$filter->equal('market_id','市场')->select($marketList)->width(2);
}
$filter->equal('store_id','店铺')->select($storeList)->width(3);
});
@ -71,7 +82,8 @@ class GoodsActivityReportController extends AdminController
new DataReportOption('this_week','goods_activity_report','本周'),
new DataReportOption('last_week','goods_activity_report','上周'),
new DataReportOption('this_month','goods_activity_report','本月'),
new DataReportOption('last_month','goods_activity_report','上月')
new DataReportOption('last_month','goods_activity_report','上月'),
new GoodsActivityExport()
]);
// 每页1条
@ -97,6 +109,10 @@ class GoodsActivityReportController extends AdminController
*/
public function index(Content $content)
{
$this->marketId = Auth::getMarket();
if($this->marketId){
$this->newParams = ['market_id'=>$this->marketId];
}
return $content->title('活动商品统计')
->body(function(Row $row){
// $row->column(2,function (Column $column){
@ -113,12 +129,35 @@ class GoodsActivityReportController extends AdminController
// $card->style('background-color:#4e9876');
// $column->row($card);
// });
$row->column(4,new OrderGoodsActivityTotalChart());
$row->column(4,new OrderGoodsActivityCountChart());
$row->column(4,new OrderGoodsActivityMarketChart());
$row->column(4,new OrderGoodsActivityTotalChart($this->newParams));
$row->column(4,new OrderGoodsActivityCountChart($this->newParams));
$row->column(4,new OrderGoodsActivityMarketChart($this->newParams));
})
->body(function(Row $row){
$row->column(12,$this->grid());
});
}
/**
* 数据导出
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function export(Request $request)
{
$params = [
'page' => request()->input('page', 1),
'name' => request()->input('name', ''),
'market_id' => request()->input('market_id',0),
'store_id' => request()->input('store_id',0),
'start_time' => request()->input('start_time',''),
'end_time' => request()->input('end_time',''),
];
$name = date('Y-m-d-His',time());
$data = new \App\Admin\Actions\Exporter\GoodsActivitySales($params);
if(empty($data)){
return $this->error('没有数据!');
}
return Excel::download($data, $name.'.xlsx');
}
}

14
app/Admin/Repositories/v3/GoodsActivityReport.php

@ -9,7 +9,7 @@ use Illuminate\Support\Facades\DB;
class GoodsActivityReport extends EloquentRepository
{
public $data = [];
public $params = [];
/**
* Model.
*
@ -17,6 +17,11 @@ class GoodsActivityReport extends EloquentRepository
*/
protected $eloquentClass = Model::class;
public function __construct($params = [])
{
$this->params = $params;
}
/**
* 获取统计列表数据
*/
@ -27,8 +32,13 @@ class GoodsActivityReport extends EloquentRepository
// 获取每页显示行数
$perPage = $model->getPerPage();
$where = [];
if(!empty($this->params) && isset($this->params['market_id']) && !empty($this->params['market_id'])){
$where = ['market_id'=>$this->params['market_id']];
}
$selects = 'SUM(number) as total,SUM((original_price-price)*number) as subsidy_total,price,original_price,lanzu_order_goods.goods_id,lanzu_order_goods.name,lanzu_order_goods.cover_img,lanzu_order_main.market_id,lanzu_order.store_id';
$orderGoodsActivity = $this->getDataModel($selects);
$orderGoodsActivity = $this->getDataModel($selects,$where);
$list = $orderGoodsActivity->orderBy('total','desc')->groupBy('goods_id','lanzu_order_goods.name','cover_img','market_id','store_id','price','original_price')->paginate($perPage);
$list = $list->toArray();

6
app/Admin/Widgets/Charts/OrderGoodsActivityCountChart.php

@ -7,6 +7,7 @@ use Dcat\Admin\Admin;
use Dcat\Admin\Support\JavaScript;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use App\Admin\Common\Auth;
class OrderGoodsActivityCountChart extends Line
{
@ -22,7 +23,7 @@ class OrderGoodsActivityCountChart extends Line
public function __construct($data = [])
{
$this->GoodsActivityReport = new GoodsActivityReport();
$this->GoodsActivityReport = new GoodsActivityReport($data);
parent::__construct();
}
@ -109,10 +110,11 @@ class OrderGoodsActivityCountChart extends Line
*/
public function parameters(): array
{
$this->marketId = Auth::getMarket();
return [
'page' => request()->input('page', 1),
'name' => request()->input('name', ''),
'market_id' => request()->input('market_id',0),
'market_id' => $this->marketId ? $this->marketId : request()->input('market_id',0),
'store_id' => request()->input('store_id',0),
'start_time' => request()->input('start_time',''),
'end_time' => request()->input('end_time',''),

6
app/Admin/Widgets/Charts/OrderGoodsActivityMarketChart.php

@ -2,6 +2,7 @@
namespace App\Admin\Widgets\Charts;
use App\Admin\Common\Auth;
use App\Admin\Repositories\v3\GoodsActivityReport;
use Dcat\Admin\Widgets\Metrics\Donut;
use Illuminate\Http\Request;
@ -22,7 +23,7 @@ class OrderGoodsActivityMarketChart extends Donut
public function __construct($data = [])
{
$this->GoodsActivityReport = new GoodsActivityReport();
$this->GoodsActivityReport = new GoodsActivityReport($data);
parent::__construct();
}
@ -83,10 +84,11 @@ class OrderGoodsActivityMarketChart extends Donut
*/
public function parameters(): array
{
$this->marketId = Auth::getMarket();
return [
'page' => request()->input('page', 1),
'name' => request()->input('name', ''),
'market_id' => request()->input('market_id',0),
'market_id' => $this->marketId ? $this->marketId : request()->input('market_id',0),
'store_id' => request()->input('store_id',0),
'start_time' => request()->input('start_time',''),
'end_time' => request()->input('end_time',''),

10
app/Admin/Widgets/Charts/OrderGoodsActivityTotalChart.php

@ -2,6 +2,7 @@
namespace App\Admin\Widgets\Charts;
use App\Admin\Common\Auth;
use App\Admin\Repositories\v3\GoodsActivityReport;
use Dcat\Admin\Admin;
use Dcat\Admin\Support\JavaScript;
@ -22,7 +23,7 @@ class OrderGoodsActivityTotalChart extends Bar
public function __construct($data = [])
{
$this->GoodsActivityReport = new GoodsActivityReport();
$this->GoodsActivityReport = new GoodsActivityReport($data);
parent::__construct();
}
@ -86,13 +87,11 @@ class OrderGoodsActivityTotalChart extends Bar
$this->total['number_total'] = $total;
}
}
$data = $this->data;
$categories = $this->categories;
$chartData = [
[
'name' => '销量',
'data' => $data,
'data' => $this->data,
]
];
$this->withContent($this->total);
@ -107,10 +106,11 @@ class OrderGoodsActivityTotalChart extends Bar
*/
public function parameters(): array
{
$this->marketId = Auth::getMarket();
return [
'page' => request()->input('page', 1),
'name' => request()->input('name', ''),
'market_id' => request()->input('market_id',0),
'market_id' => $this->marketId ? $this->marketId : request()->input('market_id',0),
'store_id' => request()->input('store_id',0),
'start_time' => request()->input('start_time',''),
'end_time' => request()->input('end_time',''),

1
app/Admin/routes.php

@ -89,5 +89,6 @@ Route::group([
$router->resource('/order_report', 'v3\OrderReportController');
// 活动商品统计
$router->any('/goods_activity_report', 'v3\GoodsActivityReportController@index');
$router->any('/goods_activity_export', 'v3\GoodsActivityReportController@export');
});
Loading…
Cancel
Save