diff --git a/app/Admin/Actions/Exporter/OrderDelivery.php b/app/Admin/Actions/Exporter/OrderDelivery.php new file mode 100644 index 0000000..2a6ea9b --- /dev/null +++ b/app/Admin/Actions/Exporter/OrderDelivery.php @@ -0,0 +1,31 @@ +params = $params; + } + + /** + * @return array + */ + public function sheets(): array + { + $sheets = []; + + $sheets[] = new OrderDeliveryTotalSheet($this->params);// 统计 + $sheets[] = new OrderDeliveryDetailSheet($this->params);// 明细 + + return $sheets; + } + +} diff --git a/app/Admin/Actions/Exporter/OrderDeliveryDetailSheet.php b/app/Admin/Actions/Exporter/OrderDeliveryDetailSheet.php new file mode 100644 index 0000000..fb3a06a --- /dev/null +++ b/app/Admin/Actions/Exporter/OrderDeliveryDetailSheet.php @@ -0,0 +1,83 @@ +params = $params; + } + + public function array(): array + { + $titles = [[ + '配送人员', + '订单编号', + '下单市场', + '下单时间', + '订单配送费', + ]]; + $data = $this->getData($this->params); + $markets = MarketModel::getMarketArray(); + $list = []; + foreach ($data as $value){ + $global_order_id = $value['global_order_id'] ?? ''; + $delivery_money = $value['delivery_money'] ?? 0; + $list[] = [ + $value['name'] ?? '', + ' '.$global_order_id, + $markets[$value['market_id']] ?? '', + date('Y-m_d H:i:s',$value['created_at']), + $delivery_money+3.5 + ]; + } + return array_merge($titles,$list); + } + + public function styles(Worksheet $sheet) + { + return [ + 1 => ['font' => ['size' => 12]], + ]; + } + /** + * 获取数据 + */ + public function getData($option = []) + { + $params = $option; + $repository = new OrderDeliveryReport(); + $selects = EmployeesModel::TABLE_NAME.'.name,global_order_id,'.OrderMainModel::$tableName.'.market_id,'.OrderMainModel::$tableName.'.created_at,delivery_money'; + + $orderGoods = $repository->getDataModel($selects,$params); + $list = $orderGoods->get()->toArray(); + + return $list; + } + + /** + * sheet 表名称 + * @return string + */ + public function title(): string + { + return '配送明细'; + } +} \ No newline at end of file diff --git a/app/Admin/Actions/Exporter/OrderDeliveryTotalSheet.php b/app/Admin/Actions/Exporter/OrderDeliveryTotalSheet.php new file mode 100644 index 0000000..27b6367 --- /dev/null +++ b/app/Admin/Actions/Exporter/OrderDeliveryTotalSheet.php @@ -0,0 +1,88 @@ +params = $params; + } + public function headings(): array + { + $startTime = $this->params['start_time'] ?? null; + $endTime = $this->params['end_time'] ?? null; + if(empty($startTime) && empty($endTime)){ + return ['统计全部']; + } + + if(empty($startTime)){ + $startTime = '2020-10-01'; + }else{ + $endTime = date('Y-m-d'); + } + + return [ + '统计时间:'.$startTime.' 至 '.$endTime + ]; + } + + public function array(): array + { + $titles = [[ + '配送人员', + '总配送费', + ]]; + $data = $this->getData($this->params); + return array_merge($titles,$data); + } + + public function styles(Worksheet $sheet) + { + $sheet->mergeCells('A1:B1'); + + return [ + 1 => ['font' => ['bold' => true,'size' => 12]], + 2 => ['font' => ['size' => 12]], + ]; + } + + /** + * 获取数据 + */ + public function getData($option = []) + { + $params = $option; + $repository = new OrderDeliveryReport(); + $selects = EmployeesModel::TABLE_NAME.'.name,SUM( CASE WHEN delivery_money=0 THEN 3.5 when delivery_money>0 THEN delivery_money+3.5 ELSE 0 END) as total_delivery'; + + $orderGoods = $repository->getDataModel($selects,$params); + $list = $orderGoods->groupBy(EmployeesModel::TABLE_NAME.'.name')->get()->toArray(); + + return $list; + } + + /** + * sheet 表名称 + * @return string + */ + public function title(): string + { + return '配送统计'; + } +} \ No newline at end of file diff --git a/app/Admin/Actions/Tools/OrderDeliveryExport.php b/app/Admin/Actions/Tools/OrderDeliveryExport.php new file mode 100644 index 0000000..9426245 --- /dev/null +++ b/app/Admin/Actions/Tools/OrderDeliveryExport.php @@ -0,0 +1,88 @@ +导出'; + + /** + * Handle the action request. + * + * @param Request $request + * + * @return Response + */ + public function handle(Request $request) + { + $url = '/delivery_report_export?'; + $name = $request->get('name', ''); + $horsemanId = $request->get('horseman_id',0); + $marketId = $request->get('market_id',0); + $storeId = $request->get('user_id',0); + $startTime = $request->get('start_time',''); + $endTime = $request->get('end_time',''); + + if(!empty($name)){ + $url .= '&name='.$name; + } + if(!empty($horsemanId)){ + $url .= '&horseman_id='.$marketId; + } + if(!empty($marketId)){ + $url .= '&market_id='.$marketId; + } + if(!empty($storeId)){ + $url .= '&user_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 [ + 'name' => request()->input('name', ''), + 'horseman_id' => request()->input('horseman_id',0), + 'market_id' => request()->input('market_id',0), + 'user_id' => request()->input('user_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; + } +} diff --git a/app/Admin/Controllers/v3/OrderDeliveryReportController.php b/app/Admin/Controllers/v3/OrderDeliveryReportController.php new file mode 100644 index 0000000..2170f7d --- /dev/null +++ b/app/Admin/Controllers/v3/OrderDeliveryReportController.php @@ -0,0 +1,135 @@ +marketId = Auth::getMarket(); + + if($this->marketId){ + $this->newParams = ['market_id'=>$this->marketId]; + $builder = new OrderDeliveryReport($this->newParams); + $this->marketList = MarketModel::getMarketArray([['id','=',$this->marketId]]); + }else{ + $builder = new OrderDeliveryReport(); + $this->marketList = MarketModel::getMarketArray(); + } + return Grid::make($builder, function (Grid $grid) { + $marketList = $this->marketList; + $grid->column('horseman_id','ID'); + $grid->column('user_id','懒ID'); + $grid->column('avatar','微信头像')->display(function(){ + $userId = $this->user_id ?? 0; + $item = UserModel::select('avatar')->find($userId); + return $item['avatar'] ?? ''; + })->image('',50); + $grid->column('name','姓名'); + + $grid->column('market_id','市场')->display(function($marketId) use($marketList){ + return $marketList[$marketId] ?? ''; + }); + + $grid->column('total_number','配送单数') + ->modal(function($modal){ + $name = $this->name; + $modal->title($name.'的配送明细'); + $startTime = request()->input('start_time') ?? null; + $endTime = request()->input('end_time') ?? null; + $table = OrderDeliveryById::make(['horseman_id'=>$this->horseman_id,'start_time'=>$startTime, 'end_time'=>$endTime]); + return $table; + }); + $grid->column('total_delivery','总配送费'); + + $grid->filter(function (Filter $filter) use($marketList) { + // 更改为 panel 布局 + $filter->panel(); + $filter->equal('start_time','开始时间')->date()->width(2); + $filter->equal('end_time','结束时间')->date()->width(2); + $filter->equal('horseman_id','配送员ID')->width(2); + $filter->equal('user_id','懒ID')->width(2); + $filter->equal('name','姓名')->width(2); + if(!$this->marketId){ + $filter->equal('market_id','市场')->select($marketList)->width(2); + } + }); + + $grid->tools([ + new DataReportOption('today','delivery_report','今日'), + new DataReportOption('yesterday','delivery_report','昨日'), + new DataReportOption('this_week','delivery_report','本周'), + new DataReportOption('last_week','delivery_report','上周'), + new DataReportOption('this_month','delivery_report','本月'), + new DataReportOption('last_month','delivery_report','上月'), + new OrderDeliveryExport() + ]); + + // 每页1条 + $grid->paginate(10); + $grid->disableCreateButton(); + $grid->disableBatchActions(); + $grid->disableBatchDelete(); + + $grid->toolsWithOutline(); + + $grid->disableDeleteButton(); + $grid->disableEditButton(); + $grid->disableQuickEditButton(); + $grid->disableViewButton(); + $grid->disableActions(); + + $grid->disableRowSelector(); + }); + } + + /** + * 数据导出 + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ + public function export(Request $request) + { + $this->marketId = Auth::getMarket(); + $params = [ + 'horseman_id' => request()->input('horseman_id', 0), + 'market_id' => $this->marketId ? $this->marketId : request()->input('market_id',0), + 'user_id' => request()->input('user_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\OrderDelivery($params); + if(empty($data)){ + return $this->error('没有数据!'); + } + return Excel::download($data, $name.'.xlsx'); + } +} diff --git a/app/Admin/Renderable/OrderDeliveryById.php b/app/Admin/Renderable/OrderDeliveryById.php new file mode 100644 index 0000000..86daab0 --- /dev/null +++ b/app/Admin/Renderable/OrderDeliveryById.php @@ -0,0 +1,89 @@ +horseman_id ?? 0; + $startTime = $this->start_time ?? null; + $endTime = $this->end_time ?? null; + $model = OrderMainModel::where('type',1)->where('shipping_type',1)->whereIn('state',OrderMainModel::ORDER_STATE_FINISH); + if($horsemanId > 0){ + $model->where('horseman_id',$horsemanId); + } + if($startTime){ + $startTime = $startTime.' 00:00:00'; + $model->where('created_at','>=',strtotime($startTime)); + } + if($endTime){ + $endTime = $endTime.' 23:59:59'; + $model->where('created_at','<=',strtotime($endTime)); + } + return Grid::make($model, function (Grid $grid) { + $marketList = MarketModel::getMarketArray(); + + $grid->column('global_order_id','订单编号'); + $grid->column('market_id','下单市场')->display(function($marketId) use($marketList){ + return $marketList[$marketId] ?? ''; + }); + + $grid->column('state','状态') + ->using( + OrderMainModel::STATE_LIST + ); + $grid->column('created_at','下单时间')->display(function($createdAt){ + return date('Y-m-d H:i:s',$createdAt); + }); + // 搜索 + $grid->filter(function (Grid\Filter $filter) use($marketList){ + + $filter->equal('user_id','下单用户懒ID')->width(3); + + $filter->equal('global_order_id','订单编号')->width(3); + + $filter->equal('market_id','下单市场')->select($marketList)->width(4); + + $filter->whereBetween('created_at',function($q){ + $start = $this->input['start'] ?? null; + $end = $this->input['end'] ?? null; + if($start !== null){ + $q->where('created_at','>=',strtotime($start)); + } + if($end !== null){ + $q->where('created_at','<=',strtotime($end)); + } + })->datetime()->width(7); + }); + $grid->model()->orderBy('id','desc'); + // 每页10条 + $grid->paginate(10); + + $grid->disableActions(); + $grid->disableRowSelector(); + }); + } + + public function default() + { + // 获取外部传递的参数 + $horsemanId = $this->payload['horseman_id'] ?? 0; + $startTime = $this->payload['start_time'] ? request()->input('start_time') : null; + $endTime = $this->payload['end_time'] ? request()->input('end_time') : null; + + return [ + 'horseman_id' => $horsemanId, + 'start_time' => $startTime, + 'end_time' => $endTime, + ]; + } +} \ No newline at end of file diff --git a/app/Admin/Repositories/v3/OrderDeliveryReport.php b/app/Admin/Repositories/v3/OrderDeliveryReport.php new file mode 100644 index 0000000..7bd77f0 --- /dev/null +++ b/app/Admin/Repositories/v3/OrderDeliveryReport.php @@ -0,0 +1,89 @@ +params = $params; + } + + /** + * 获取统计列表数据 + */ + public function get(GridModel $model) + { + // 获取当前页数 + $currentPage = $model->getCurrentPage(); + // 获取每页显示行数 + $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 = 'count('.Model::$tableName.'.id) AS total_number,horseman_id,'.EmployeesModel::TABLE_NAME.'.user_id,'.EmployeesModel::TABLE_NAME.'.name,'.EmployeesModel::TABLE_NAME.'.market_id,SUM( CASE WHEN delivery_money=0 THEN 3.5 when delivery_money>0 THEN delivery_money+3.5 ELSE 0 END) as total_delivery'; + $delivery = $this->getDataModel($selects,$where); + $list = $delivery->groupBy('horseman_id',EmployeesModel::TABLE_NAME.'.market_id',EmployeesModel::TABLE_NAME.'.name',EmployeesModel::TABLE_NAME.'.user_id')->paginate($perPage); + // ->orderBy('total_number','desc') + $list = $list->toArray(); + + return $model->makePaginator( + $list['total'] ?? 0,$list['data'] ?? [] + ); + } + + public function getDataModel($selects,$params = []) + { + // 获取筛选参数 + $userId = $params['user_id'] ?? request()->input('user_id',0); + $name = $params['name'] ?? request()->input('name', ''); + $marketId = $params['market_id'] ?? request()->input('market_id',0); + + $startTime = $params['start_time'] ?? request()->input('start_time',''); + $endTime = $params['end_time'] ?? request()->input('end_time',''); + // 外卖类型 type = 1 + $model = Model::select(DB::raw($selects)) + // ->with('employees:id,user_id,name,market_id') + ->join(EmployeesModel::TABLE_NAME,EmployeesModel::TABLE_NAME.'.id','=',Model::$tableName.'.horseman_id','left') + ->where(Model::$tableName.'.type',1) + ->where('shipping_type',1) + ->whereIn('state',Model::ORDER_STATE_FINISH); + + if($userId){ + $model->where(EmployeesModel::TABLE_NAME.'.user_id',$userId); + } + if($name){ + $model->where(EmployeesModel::TABLE_NAME.'.name','like',"%$name%"); + } + if($marketId){ + $model->where(EmployeesModel::TABLE_NAME.'.market_id',$marketId); + } + if($startTime){ + $startTime = $startTime.' 00:00:00'; + $model->where(Model::$tableName.'.created_at','>=',strtotime($startTime)); + } + if($endTime){ + $endTime = $endTime.' 23:59:59'; + $model->where(Model::$tableName.'.created_at','<=',strtotime($endTime)); + } + + return $model; + } + +} diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 52034cc..eb22da2 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -97,10 +97,16 @@ Route::group([ $router->resource('/goods_report', 'v3\GoodsReportController'); $router->any('/goods_report_export', 'v3\GoodsReportController@export'); + + // 配送统计 + $router->resource('/delivery_report', 'v3\OrderDeliveryReportController'); + $router->any('/delivery_report_export', 'v3\OrderDeliveryReportController@export'); + + // 活动商品设置 $router->get('/goods_activity_setting', 'v3\GoodsActivityController@ActivitySettingForm'); // 分享小卡片设置 $router->resource('/share_card_setting', 'v3\ShareCardSettingController'); // 关注公众号设置 - $router->any('/official_subscribe_info', 'v3\SystemConfigController@OfficialSubscribeInfoSettingForm');}); - + $router->any('/official_subscribe_info', 'v3\SystemConfigController@OfficialSubscribeInfoSettingForm'); +}); diff --git a/app/Models/ImsCjdcOrderMain.php b/app/Models/ImsCjdcOrderMain.php index 9bc5744..332ba5a 100644 --- a/app/Models/ImsCjdcOrderMain.php +++ b/app/Models/ImsCjdcOrderMain.php @@ -7,6 +7,7 @@ use Dcat\Admin\Traits\HasDateTimeFormatter; use App\Models\v3\Market as MarketModel; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; +use App\Models\v3\LanzuEmployees as EmployeesModel; class ImsCjdcOrderMain extends Model { @@ -36,9 +37,25 @@ class ImsCjdcOrderMain extends Model const ORDER_STATE_REFUNDED = 9; // 拒绝退款 const ORDER_STATE_UNREFUND = 10; + // 部分退款 + const ORDER_STATE_REBATES = 11; // 完成状态组合 - const ORDER_STATE_FINISH = [self::ORDER_STATE_COMPLETE, self::ORDER_STATE_EVALUATED, self::ORDER_STATE_UNREFUND]; - + const ORDER_STATE_FINISH = [self::ORDER_STATE_COMPLETE, self::ORDER_STATE_EVALUATED, self::ORDER_STATE_UNREFUND, self::ORDER_STATE_REBATES]; + + const STATE_LIST = [ + self::ORDER_STATE_UNPAY => '待支付', + self::ORDER_STATE_UNTAKE => '待接单', + self::ORDER_STATE_DELIVERY => '待送达', + self::ORDER_STATE_COMPLETE => '已完成', + self::ORDER_STATE_EVALUATED => '已评价', + self::ORDER_STATE_CANCEL => '已取消', + self::ORDER_STATE_REFUSE => '已拒单', + self::ORDER_STATE_REFUNDING => '退款中', + self::ORDER_STATE_REFUNDED => '已退款', + self::ORDER_STATE_UNREFUND => '拒绝退款', + self::ORDER_STATE_REBATES => '部分退款', + ]; + const TABLE_NAME = 'lanzu_order_main'; // 订单支付方式 // 微信支付 const ORDER_PAY_WX = 1; @@ -46,7 +63,7 @@ class ImsCjdcOrderMain extends Model const ORDER_PAY_BALANCE = 2; use HasDateTimeFormatter; - //protected $table = 'ims_cjdc_order_main'; + protected $table = 'lanzu_order_main'; public $timestamps = false; @@ -141,4 +158,12 @@ class ImsCjdcOrderMain extends Model $count = $builder->count(); return $count; } + + /** + * 关联懒族员工表 + */ + public function employees() + { + return $this->belongsTo(new EmployeesModel(),'horseman_id','id','left'); + } } diff --git a/app/Models/v3/LanzuEmployees.php b/app/Models/v3/LanzuEmployees.php index 5ed4d81..da184bc 100644 --- a/app/Models/v3/LanzuEmployees.php +++ b/app/Models/v3/LanzuEmployees.php @@ -10,7 +10,7 @@ class LanzuEmployees extends Model { use HasDateTimeFormatter; use SoftDeletes; - + const TABLE_NAME = 'lanzu_employees'; protected $table = 'lanzu_employees'; protected $dateFormat = 'U'; diff --git a/resources/lang/zh-CN/order-delivery-report.php b/resources/lang/zh-CN/order-delivery-report.php new file mode 100644 index 0000000..6be9b83 --- /dev/null +++ b/resources/lang/zh-CN/order-delivery-report.php @@ -0,0 +1,14 @@ + [ + 'OrderDeliveryReport' => '配送统计报表', + 'order_delivery_report' => '配送统计报表', + 'delivery_report' => '配送统计', + ], + 'fields' => [ + 'user_id' => '懒ID', + 'name' => '姓名', + ], + 'options' => [ + ], +];