374 lines
15 KiB
PHP
374 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers;
|
|
|
|
use App\Admin\Actions\Grid\CreateOrderPackage;
|
|
use App\Admin\Actions\Show\OrderConsigneeInfo;
|
|
use App\Admin\Actions\Show\OrderCreatePackage;
|
|
use App\Admin\Actions\Show\OrderPay;
|
|
use App\Admin\Actions\Show\OrderReduce;
|
|
use App\Admin\Actions\Show\OrderRemark;
|
|
use App\Admin\Renderable\PackageProductSimpleTable;
|
|
use App\Admin\Repositories\Order;
|
|
use App\Models\Order as OrderModel;
|
|
use App\Models\OrderLog;
|
|
use App\Models\OrderPackage;
|
|
use App\Models\OrderProduct;
|
|
use Dcat\Admin\Admin;
|
|
use Dcat\Admin\Form;
|
|
use Dcat\Admin\Grid;
|
|
use Dcat\Admin\Http\Controllers\AdminController;
|
|
use Dcat\Admin\Layout\Row;
|
|
use Dcat\Admin\Show;
|
|
use Dcat\Admin\Widgets\Box;
|
|
use Illuminate\Http\Request;
|
|
|
|
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('sn');
|
|
$grid->column('user.phone');
|
|
$grid->column('total_amount')->display(function ($value) {
|
|
return bcdiv($value, 100, 2);
|
|
})->prepend('¥');
|
|
$grid->column('order_status')->display(function ($value) {
|
|
return $this->order_status;
|
|
})->using([
|
|
0=>'待付款',
|
|
1=>'待发货',
|
|
2=>'发货中',
|
|
3=>'已发货',
|
|
9=>'已完成',
|
|
10=>'已取消',
|
|
])->dot([
|
|
0=>'primary',
|
|
1=>'warning',
|
|
2=>'danger',
|
|
3=>'success',
|
|
9=>'success',
|
|
10=>'#b3b9bf',
|
|
]);
|
|
$grid->column('pay_way')->using([
|
|
'wxpay'=>'微信支付',
|
|
'alipay'=>'支付宝',
|
|
'offline'=>'线下支付',
|
|
'none'=>'无',
|
|
])->label([
|
|
'wxpay'=>'success',
|
|
'alipay'=>'primary',
|
|
'offline'=>'warning',
|
|
'none'=>'#b3b9bf',
|
|
]);
|
|
$grid->column('pay_at');
|
|
// $grid->column('consignee_name');
|
|
// $grid->column('consignee_telephone');
|
|
// $grid->column('consignee_zone');
|
|
// $grid->column('consignee_address');
|
|
|
|
// $grid->column('status')->using([
|
|
// 0=>'待支付',
|
|
// 1=>'待收货',
|
|
// 9=>'已完成',
|
|
// 10=>'已取消',
|
|
// ])->dot([
|
|
// 0=>'primary',
|
|
// 1=>'danger',
|
|
// 9=>'success',
|
|
// 10=>'#b3b9bf',
|
|
// ]);
|
|
// $grid->column('shipping_state')->display(function ($v) {
|
|
// if ($this->status <1) {
|
|
// return -1;
|
|
// }
|
|
// return $v;
|
|
// })->using([
|
|
// -1=> '-',
|
|
// 0 => '待发货',
|
|
// 1 => '发货中',
|
|
// 2 => '已完成',
|
|
// ])->dot([
|
|
// 0 => 'primary',
|
|
// 1 => 'danger',
|
|
// 2 => 'success',
|
|
// ]);
|
|
// $grid->column('completed_at');
|
|
$grid->column('created_at')->sortable();
|
|
|
|
$grid->model()->orderBy('created_at', 'desc');
|
|
|
|
$grid->actions(function (Grid\Displayers\Actions $actions) {
|
|
$actions->disableView(false);
|
|
// $actions->append(new CreateOrderPackage());
|
|
});
|
|
|
|
$grid->filter(function (Grid\Filter $filter) {
|
|
$filter->panel();
|
|
$filter->equal('sn')->width(3);
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Make a show builder.
|
|
*
|
|
* @param mixed $id
|
|
*
|
|
* @return Show
|
|
*/
|
|
protected function detail($id)
|
|
{
|
|
return function (Row $row) use ($id) {
|
|
$row->column(5, function ($column) use ($id) {
|
|
$builder = Order::with(['user', 'userCoupon']);
|
|
$column->row(Show::make($id, $builder, function (Show $show) {
|
|
// $show->field('id');
|
|
$show->field('sn');
|
|
$show->field('order_status')->as(function ($v) {
|
|
return $this->order_status;
|
|
})->using([
|
|
0=>'待付款',
|
|
1=>'待发货',
|
|
2=>'发货中',
|
|
3=>'已发货',
|
|
9=>'已完成',
|
|
10=>'已取消',
|
|
])->dot([
|
|
0=>'primary',
|
|
1=>'warning',
|
|
2=>'danger',
|
|
3=>'success',
|
|
9=>'success',
|
|
10=>'#b3b9bf',
|
|
]);
|
|
$show->field('total_amount')->as(function ($v) {
|
|
return bcdiv($v, 100, 2);
|
|
})->prepend('¥');
|
|
$show->field('created_at');
|
|
$show->field('pay_way')->using([
|
|
'wxpay'=>'微信支付',
|
|
'alipay'=>'支付宝',
|
|
'offline'=>'线下支付',
|
|
'none'=>'无',
|
|
])->showLabel([
|
|
'微信支付'=>'success',
|
|
'支付宝'=>'primary',
|
|
'线下支付'=>'warning',
|
|
'无'=>'#b3b9bf',
|
|
]);
|
|
$show->field('pay_at');
|
|
|
|
$show->divider();
|
|
$show->field('consignee_name');
|
|
$show->field('consignee_telephone');
|
|
$show->field('consignee')->as(function () {
|
|
return $this->consignee_zone . ' '. $this->consignee_address;
|
|
});
|
|
// $show->field('user.phone');
|
|
$show->divider();
|
|
$show->field('products_total_amount')->as(function ($v) {
|
|
return bcdiv($v, 100, 2);
|
|
})->prepend('¥');
|
|
$show->field('vip_discount_amount')->as(function ($v) {
|
|
return bcdiv($v, 100, 2);
|
|
})->prepend('- ¥');
|
|
if ($show->model()->user_coupon_id) {
|
|
$show->field('userCoupon.coupon_name')->label();
|
|
$show->field('coupon_discount_amount')->as(function ($v) {
|
|
return bcdiv($v, 100, 2);
|
|
})->prepend('- ¥');
|
|
}
|
|
$show->field('shipping_fee')->as(function ($v) {
|
|
return bcdiv($v, 100, 2);
|
|
})->prepend('+ ¥');
|
|
$show->field('reduced_amount')->as(function ($v) {
|
|
return bcdiv($v, 100, 2);
|
|
})->prepend('- ¥');
|
|
$show->divider();
|
|
$show->field('note');
|
|
$show->field('remark');
|
|
|
|
$show->panel()
|
|
->tools(function (Show\Tools $tools) use ($show) {
|
|
$tools->disableEdit();
|
|
$tools->disableDelete();
|
|
|
|
if ($show->model()->status == OrderModel::STATUS_PENDING) {
|
|
if (Admin::user()->can('dcat.admin.orders.reduce')) {
|
|
$tools->append(new OrderReduce());
|
|
}
|
|
if (Admin::user()->can('dcat.admin.orders.pay')) {
|
|
$tools->append(new OrderPay());
|
|
}
|
|
}
|
|
$tools->append(new OrderRemark());
|
|
if ($show->model()->isPending() || $show->model()->isWaitShipping() || $show->model()->isShipping()) {
|
|
$tools->append(new OrderConsigneeInfo());
|
|
}
|
|
});
|
|
}));
|
|
});
|
|
$row->column(7, function ($column) use ($id) {
|
|
$builder = OrderProduct::where('order_id', $id);
|
|
$productGrid = Grid::make($builder, function (Grid $grid) {
|
|
$grid->column('name');
|
|
$grid->column('cover')->image(50, 50);
|
|
$grid->column('sell_price')->display(function ($value) {
|
|
return bcdiv($value, 100, 2);
|
|
})->prepend('¥');
|
|
$grid->column('quantity');
|
|
$grid->column('remain_quantity');
|
|
|
|
$grid->column('product_total_amount')->display(function () {
|
|
return bcdiv($this->sell_price * $this->quantity, 100, 2);
|
|
})->prepend('¥');
|
|
$grid->column('after_sale_state')->using([
|
|
0=>'正常',
|
|
1=>'售后中',
|
|
2=>'售后完成',
|
|
])->dot([
|
|
0=>'success',
|
|
1=>'danger',
|
|
2=>'primary',
|
|
]);
|
|
$grid->disableActions();
|
|
$grid->disablePagination();
|
|
$grid->disableRefreshButton();
|
|
});
|
|
$packageBuilder = OrderPackage::with('packageProducts')->where('order_id', $id);
|
|
$packageGrid = Grid::make($packageBuilder, function (Grid $grid) {
|
|
$grid->column('shipping_company', '物流公司');
|
|
$grid->column('shipping_number', '物流单号');
|
|
$grid->column('packageProducts', '包裹商品')->display('包裹商品')->modal(function ($modal) {
|
|
$modal->title('商品');
|
|
return PackageProductSimpleTable::make(['id'=>$this->id]);
|
|
})->setHeaderAttributes(['style' => 'color:#5b69bc']);
|
|
$grid->column('created_at', '发货时间');
|
|
$grid->column('status', '包裹状态')->using([
|
|
OrderPackage::STATUS_WAIT => '揽收',
|
|
OrderPackage::STATUS_ONTHEWAY =>'途中',
|
|
OrderPackage::STATUS_DISTRIBUTE=>'派送',
|
|
OrderPackage::STATUS_CHECK=>'签收',
|
|
OrderPackage::STATUS_QUESTION => '疑难',
|
|
OrderPackage::STATUS_REFUND => '退签',
|
|
OrderPackage::STATUS_REFUSE => '拒签',
|
|
OrderPackage::STATUS_OTHER => '其他',
|
|
OrderPackage::STATUS_AUTOCHECK => '自动签收',
|
|
])->dot([
|
|
OrderPackage::STATUS_REFUND =>'danger',
|
|
OrderPackage::STATUS_REFUSE =>'danger',
|
|
OrderPackage::STATUS_AUTOCHECK =>'success',
|
|
OrderPackage::STATUS_CHECK =>'success',
|
|
OrderPackage::STATUS_WAIT =>'primary',
|
|
OrderPackage::STATUS_ONTHEWAY =>'primary',
|
|
OrderPackage::STATUS_DISTRIBUTE=>'primary',
|
|
OrderPackage::STATUS_QUESTION =>'warning',
|
|
]);
|
|
$grid->column('is_failed', '作废')->bool();
|
|
$grid->model()->orderBy('created_at', 'desc');
|
|
|
|
$grid->disableActions();
|
|
$grid->disablePagination();
|
|
$grid->disableRefreshButton();
|
|
});
|
|
$logBuilder = OrderLog::with('administrator')->where('order_id', $id);
|
|
$orderLogoGrid = Grid::make($logBuilder, function (Grid $grid) {
|
|
$grid->column('administrator.name', '操作人');
|
|
$grid->column('content', '操作明细')->display(function ($content) {
|
|
return $content;
|
|
});
|
|
$grid->column('created_at', '操作时间');
|
|
$grid->model()->orderBy('created_at', 'desc');
|
|
|
|
$grid->disableActions();
|
|
$grid->disablePagination();
|
|
$grid->disableRefreshButton();
|
|
});
|
|
|
|
$column->row(Box::make('订单商品', $productGrid));
|
|
$packagesBox = Box::make('发货包裹', $packageGrid);
|
|
//显示发货动作
|
|
$order = OrderModel::findOrFail($id);
|
|
if ($order->isWaitShipping() || $order->isShipping()) {
|
|
$packagesBox->tool(new OrderCreatePackage(null, $id));
|
|
}
|
|
|
|
$column->row($packagesBox->collapsable());
|
|
$logsBox = Box::make('操作记录', $orderLogoGrid);
|
|
$column->row($logsBox->collapsable());
|
|
});
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 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('sn');
|
|
$form->text('user_coupon_id');
|
|
$form->text('coupon_discount_amount');
|
|
$form->text('vip_discount_amount');
|
|
$form->text('reduced_amount');
|
|
$form->text('shipping_fee');
|
|
$form->text('products_total_amount');
|
|
$form->text('total_amount');
|
|
$form->text('weight');
|
|
$form->text('note');
|
|
$form->text('remark');
|
|
$form->text('pay_sn');
|
|
$form->text('pay_way');
|
|
$form->text('pay_at');
|
|
$form->text('consignee_name');
|
|
$form->text('consignee_telephone');
|
|
$form->text('consignee_zone');
|
|
$form->text('consignee_address');
|
|
$form->text('status');
|
|
$form->text('completed_at');
|
|
|
|
$form->display('created_at');
|
|
$form->display('updated_at');
|
|
});
|
|
}
|
|
|
|
public function orders(Request $request)
|
|
{
|
|
$sn = $request->input('q');
|
|
|
|
$query = OrderModel::select('id', 'sn as text');
|
|
|
|
if ($sn) {
|
|
$query->where('sn', 'like', "%$sn%");
|
|
return $query->paginate(null);
|
|
}
|
|
|
|
return response()->json($query->get());
|
|
}
|
|
|
|
public function orderProducts(Request $request)
|
|
{
|
|
$orderId = $request->input('q');
|
|
|
|
$query = OrderProduct::select('id', 'name as text');
|
|
|
|
if ($orderId) {
|
|
$query->where('order_id', $orderId);
|
|
}
|
|
|
|
return response()->json($query->get());
|
|
}
|
|
}
|