order-food-admin/app/Admin/Controllers/OrderController.php

288 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Admin\Controllers;
use Carbon\Carbon;
use App\Admin\Repositories\{Order, OrderGoods};
use Illuminate\Http\Request;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Content;
use App\Admin\Pages\{CreateOrder,PickupOrder};
use App\Models\{Order as OrderModel};
use App\Services\OrderService;
use App\Admin\Actions\RowActions\OrderPickUpNotice;
use Dcat\Admin\Http\JsonResponse;
class OrderController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$builder = Order::with(['user']);
return Grid::make($builder, function (Grid $grid) {
// $grid->column('id')->sortable();
$grid->column('order_sn');
$grid->column('order_number');
$grid->column('order_phone', '手机号');
$grid->column('order_price');
$grid->column('pay_type')->using(['1'=>'微信支付', '2' => '兑换支付', '3'=>'线下点单'])->label([
1 => 'success',
2 => 'warning',
3 => Admin::color()->info(),
]);
$grid->column('order_status')->bool(['1' => true, '-1' => false]);
$grid->column('pay_status')->bool(['1' => true, '0' => false]);
// $grid->column('shipping_status')->bool(['1' => true, '0' => false]);
// $grid->column('pay_time');
// $grid->column('shipping_time');
// $grid->column('closed_time');
// $grid->column('is_reserve','是否预约')->using(['1'=>'预约订单', '0' => '普通订单'])->label([
// 0 => 'success',
// 1 => 'danger',
// ]);
// $grid->column('is_niu')->using(['1'=>'吹牛订单', '0' => '普通订单'])->label([
// 0 => 'success',
// 1 => 'danger',
// ]);
$grid->column('created_at', '下单时间');
// $grid->column('updated_at')->sortable();
$grid->model()->orderBy('created_at', 'desc');
$grid->filter(function (Grid\Filter $filter) {
$filter->expand(false);
// $filter->equal('id');
$filter->equal('order_sn');
$filter->equal('pay_status')->select([0 => '未支付', 1 => '已支付'])->default(1);
$filter->equal('order_phone', '手机号');
$filter->between('created_at', '下单时间')->date();
});
$grid->actions(function (Grid\Displayers\Actions $actions) {
if($actions->row->order_status == 1){
$actions->disableDelete();
}
if( $actions->row->pay_type == 1 &&
$actions->row->order_status == 1 &&
$actions->row->pay_status != 3 &&
$actions->row->pickup_notice == 0 &&
!empty($actions->row->order_number)
){
$actions->append(new OrderPickUpNotice());
}
$actions->disableEdit();
});
$grid->header(function ($collection) use ($grid) {
$query = OrderModel::query();
// 拿到表格筛选 where 条件数组进行遍历
$grid->model()->getQueries()->unique()->each(function ($value) use (&$query) {
if (in_array($value['method'], ['paginate', 'get', 'orderBy', 'orderByDesc'], true)) {
return;
}
$query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []);
});
// 查出统计数据
$data = $query->get();
$total_fee = $data->sum('pay_price');
$total_num = $data->count();
return "<div style='padding: 10px;'>订单数:$total_num 单 | 统计收益 $total_fee 元</div>";
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, Order::with(['ticket','ticket.quanTicket']), function (Show $show) {
$show->row(function(Show\Row $show){
$show->width(4)->field('order_sn');
$show->width(4)->field('is_reserve', '是否预约')->using(['0' => '普通订单', '1'=>'预约订单'])->label()->append(function($info){
return $this->is_reserve? Carbon::parse($this->reserve_time)->toDateString():'';
});
// $show->width(4)->field('is_niu','是否吹牛')->using(['0' => '普通订单', '1'=>'吹牛订单'])->label();
});
$show->row(function(Show\Row $show){
$show->width(4)->field('order_number');
$show->width(4)->field('order_phone', '手机号');
$show->width(4)->field('order_price')->prepend('¥');
});
//优惠券信息
$show->row(function(Show\Row $show){
$show->width(4)->field('ticket_id', '优惠券')->as(function(){
return $this->ticket->quanTicket->quan_name??'';
})->label();
$show->width(4)->field('ticket_value', '优惠金额')->prepend('¥');
$show->width(4)->field('pay_price', '支付价格')->prepend('¥');
});
$show->row(function(Show\Row $show){
$show->width(4)->field('order_status', '订单状态')->using(['0'=>'未确认', '1' => '已确认', '-1'=>'已取消']);
$show->width(4)->field('pay_status', '支付状态')->using(['0'=>'未支付', '1' => '已支付']);
$show->width(4)->field('shipping_status', '取餐状态')->using(['0'=>'未取餐', '1' => '已取餐']);
});
$show->row(function(Show\Row $show){
$show->width(4)->field('created_at', '下单时间');
$show->width(4)->field('pay_time', '支付时间');
$show->width(4)->field('shipping_time', '取餐时间');
});
// $show->row(function(Show\Row $show){
$show->goods(function ($model) {
$grid = new Grid(new OrderGoods);
$grid->disablePagination();
$grid->disableToolbar();
$grid->disableRefreshButton();
$grid->disableActions();
$grid->model()->where('order_id', $model->id);
$grid->disableRowSelector();
$grid->goods_name('商品名称');
// $grid->column('is_too', '第二杯半价')->bool(['1' => true, '0' => false]);
$grid->goods_attrs('规格属性')->display(function($goods_attrs){
$goods_attrs = json_decode($goods_attrs, true);
return isset($goods_attrs['info_name']) ? $goods_attrs['info_name']:'';
})->label();
$grid->goods_num('商品数量')->prepend('X ');
$grid->goods_price('商品价格')->prepend('¥');
// $grid->goods_cover()->image(100, 100);
return $grid;
});
// });
$show->panel()
->tools(function ($tools) {
$tools->disableEdit();
$tools->disableDelete();
});
});
}
/**
* 线下下单
*/
public function create(Content $content){
return $content->header('线下下单')
->description('表单')
->body(new CreateOrder());
}
public function toStore(Request $request){
$goods_infos = $request->input('goods_info');
$goods_infos = json_decode($goods_infos, true);
$is_ajax = $request->ajax();
if(count($goods_infos) > 0){
$order_service = new OrderService();
$order = $order_service->createOrderToAdmin($goods_infos);
if(isset($order['status']) && $order['status'] == false){
if($is_ajax){
return JsonResponse::make()->error('下单失败:'.$order['message']);
}else{
admin_toastr('下单失败:'.$order['message'], 'error');
}
}else{
if($is_ajax){
$order = $order_service->payOrder($order);
return JsonResponse::make()->success('下单成功, 取餐码: '.($order->order_number??''));
}else{
admin_toastr('下单成功', 'success');
}
}
}else{
if($is_ajax){
return JsonResponse::make()->error('下单失败');
}else{
admin_toastr('下单失败', 'error');
}
}
return redirect(admin_route('orders.index'));
}
/**
* 取餐核销
*/
public function pickup(Content $content){
return $content->header('取餐核销')
->description('表单')
->body(new PickupOrder());
}
/**
* 确认取餐
*/
public function toPickup(Request $request){
$order_sn = $request->input('order_number');
$order = OrderModel::where('order_sn', $order_sn)
// $start_time = Carbon::now()->startOfDay();
// $end_time = Carbon::now()->endOfDay();
// $order_number = $request->input('order_number');
// OrderModel::where('order_number', $order_number)
// ->whereBetween('created_at', [$start_time, $end_time])
->where([
'order_status' =>1,
'pay_status' =>1
])
->first();
if($order){
if($order->shipping_status == 0){
$order_service = new OrderService();
$res = $order_service->shippingOrder($order);
if(isset($res['status']) && $res['status']==false){
return JsonResponse::make()->error($res['message']);
}else{
return JsonResponse::make()->success('取餐成功');
}
}else{
return JsonResponse::make()->error('该订单已取餐');
}
}else{
return JsonResponse::make()->error('未找到符合订单');
}
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new Order(), function (Form $form) {
$form->display('id');
$form->text('user_id');
$form->text('order_sn');
$form->text('order_number');
$form->text('order_price');
$form->text('pay_type');
$form->text('shipping_status');
$form->text('is_niu');
$form->display('created_at');
$form->display('updated_at');
});
}
public function destroy($id){
$goods = OrderModel::findOrFail($id);
if($goods->pay_status == 1){
return JsonResponse::make()->error('该订单已支付,无法删除');
}
return parent::destroy($id);
}
}