303 lines
14 KiB
PHP
303 lines
14 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers;
|
|
|
|
use App\Admin\Actions\Grid\AfterSaleSetTag;
|
|
use App\Admin\Actions\Show\AfterSaleFinance;
|
|
use App\Admin\Actions\Show\AfterSaleFinanceShipping;
|
|
use App\Admin\Actions\Show\AfterSaleShipping;
|
|
use App\Admin\Actions\Show\AfterSaleShippingFail;
|
|
use App\Admin\Actions\Show\AfterSaleShippingFill;
|
|
use App\Admin\Actions\Show\AfterSaleVerify;
|
|
use App\Admin\Repositories\AfterSale;
|
|
use App\Models\AfterSale as AfterSaleModel;
|
|
use App\Models\AfterSaleLog;
|
|
use App\Models\Tag;
|
|
use Dcat\Admin\Admin;
|
|
use Dcat\Admin\Form;
|
|
use Dcat\Admin\Grid;
|
|
use Dcat\Admin\Grid\Column;
|
|
use Dcat\Admin\Http\Controllers\AdminController;
|
|
use Dcat\Admin\Layout\Row;
|
|
use Dcat\Admin\Show;
|
|
use Dcat\Admin\Widgets\Box;
|
|
use Illuminate\Support\Facades\Request;
|
|
|
|
class AfterSaleController extends AdminController
|
|
{
|
|
/**
|
|
* Make a grid builder.
|
|
*
|
|
* @return Grid
|
|
*/
|
|
protected function grid()
|
|
{
|
|
$builder = AfterSale::with(['user', 'user.userInfo', 'order', 'orderProduct', 'tags']);
|
|
|
|
return Grid::make($builder, function (Grid $grid) {
|
|
$orderProductId = Request::query('order_product_id', 0);
|
|
if ($orderProductId) {
|
|
$grid->model()->where('order_product_id', $orderProductId);
|
|
}
|
|
|
|
$grid->column('id')->sortable()->if(function () {
|
|
return Admin::user()->can('dcat.admin.after_sales.show');
|
|
})->then(function (Column $column) {
|
|
$column->link(function ($value) {
|
|
return admin_route('after_sales.show', ['after_sale' => $value]);
|
|
});
|
|
});
|
|
|
|
$grid->column('sn')->copyable();
|
|
$grid->column('tags', '标签')->display(function ($tags) {
|
|
$array = [];
|
|
foreach ($this->tags as $key => $tag) {
|
|
$array[] = $tag->name;
|
|
}
|
|
return $array;
|
|
})->label();
|
|
$grid->column('user.phone')->copyable();
|
|
$grid->column('user.userInfo.nickname');
|
|
$grid->column('order.sn')->if(function () {
|
|
return Admin::user()->can('dcat.admin.orders.show');
|
|
})
|
|
->then(function (Column $column) {
|
|
$column->link(function ($value) {
|
|
return admin_url('orders/'.$this->order_id);
|
|
});
|
|
})
|
|
->else(function (Column $column) {
|
|
$column->copyable();
|
|
});
|
|
|
|
$grid->column('orderProduct.name');
|
|
$grid->column('num');
|
|
$grid->column('amount')->display(function ($value) {
|
|
if (in_array($this->type, [AfterSaleModel::TYPE_CHANGE, AfterSaleModel::TYPE_FILL])) {
|
|
return '0.00';
|
|
}
|
|
return bcdiv($value, 100, 2);
|
|
})->prepend('¥');
|
|
$grid->column('type')->using([
|
|
AfterSaleModel::TYPE_REFUND_AND_RETURN => '退款退货',
|
|
AfterSaleModel::TYPE_REFUND => '退款',
|
|
AfterSaleModel::TYPE_CHANGE => '换货',
|
|
AfterSaleModel::TYPE_FILL => '漏发',
|
|
])->label();
|
|
$grid->column('state')->using(AfterSaleModel::$stateText)->dot([
|
|
AfterSaleModel::STATE_APPLY=>'warning',
|
|
AfterSaleModel::STATE_VERIFY=>'danger',
|
|
AfterSaleModel::STATE_AGREE=>'warning',
|
|
AfterSaleModel::STATE_SHIPPING=>'primary',
|
|
AfterSaleModel::STATE_FINANCE=>'primary',
|
|
AfterSaleModel::STATE_FINISH=>'success',
|
|
]);
|
|
// $grid->column('remarks');
|
|
// $grid->column('tracking_number');
|
|
|
|
$grid->column('created_at');
|
|
$grid->column('updated_at')->sortable();
|
|
$grid->model()->orderBy('created_at', 'desc');
|
|
|
|
$grid->actions(function (Grid\Displayers\Actions $actions) {
|
|
if (Admin::user()->can('dcat.admin.after_sales.show')) {
|
|
$actions->disableView(false);
|
|
}
|
|
|
|
if (Admin::user()->can('dcat.admin.after_sales.tags')) {
|
|
$actions->append(new AfterSaleSetTag());
|
|
}
|
|
});
|
|
|
|
$grid->setResource('after-sales');
|
|
$grid->filter(function (Grid\Filter $filter) {
|
|
$filter->panel();
|
|
$filter->equal('state')->select(AfterSaleModel::$stateText)->width(3);
|
|
$filter->equal('user.phone')->width(3);
|
|
$filter->equal('order.sn')->width(3);
|
|
$filter->equal('sn')->width(3);
|
|
$filter->where('tags', function ($query) {
|
|
$query->whereHas('tags', function ($q) {
|
|
$q->whereIn('tags.id', $this->input);
|
|
});
|
|
}, '标签')->multipleSelect(Tag::AfterSaleTag()->pluck('name', 'id'))->width(3);
|
|
$filter->between('created_at')->dateTime()->width(7);
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 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 = AfterSale::with(['user', 'user.userInfo', 'order', 'orderProduct', 'tags']);
|
|
$column->row(Show::make($id, $builder, function (Show $show) {
|
|
// $show->field('id');
|
|
$type = $show->model()->type;
|
|
$show->row(function (Show\Row $show) use ($type) {
|
|
$show->width(6)->field('sn');
|
|
$show->field('order.sn', '关联订单编号')->unescape()->as(function ($value) {
|
|
if (Admin::user()->can('dcat.admin.orders.show')) {
|
|
return '<a href="'.admin_route('orders.show', ['order'=>$this->order]).'" target="_blank">'.$value.'</a>';
|
|
}
|
|
return $value;
|
|
});
|
|
$show->field('order_product.name', '售后商品')->as(function ($value) {
|
|
return $value.'*'. $this->num;
|
|
});
|
|
// $show->field('num');
|
|
if (in_array($type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_REFUND])) {
|
|
$show->field('amount', '售后金额')->as(function ($amount) {
|
|
return '¥'.bcdiv($amount, 100, 2);
|
|
});
|
|
}
|
|
$show->width(6)->field('user.user_info.nickname', '下单用户');
|
|
$show->field('user.phone');
|
|
$show->field('type')->using([
|
|
AfterSaleModel::TYPE_REFUND_AND_RETURN => '退款退货',
|
|
AfterSaleModel::TYPE_REFUND => '退款',
|
|
AfterSaleModel::TYPE_CHANGE => '换货',
|
|
AfterSaleModel::TYPE_FILL => '漏发',
|
|
])->label();
|
|
if (in_array($type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_REFUND, AfterSaleModel::TYPE_CHANGE])) {
|
|
$show->field('sales_value', '销售值');
|
|
}
|
|
});
|
|
$status = $stae = $show->model()->state;
|
|
$show->row(function (Show\Row $show) use ($type, $status) {
|
|
$show->width(6)->field('state')->using(AfterSaleModel::$stateText)->dot([
|
|
AfterSaleModel::STATE_APPLY=>'warning',
|
|
AfterSaleModel::STATE_VERIFY=>'danger',
|
|
AfterSaleModel::STATE_AGREE=>'warning',
|
|
AfterSaleModel::STATE_SHIPPING=>'primary',
|
|
AfterSaleModel::STATE_FINANCE=>'primary',
|
|
AfterSaleModel::STATE_FINISH=>'success',
|
|
AfterSaleModel::STATE_CANCEL=>'#b3b9bf',
|
|
]);
|
|
if (in_array($type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_CHANGE]) && in_array($status, [
|
|
AfterSaleModel::STATE_SHIPPING, AfterSaleModel::STATE_FINANCE, AfterSaleModel::STATE_FINISH,
|
|
])) {
|
|
$show->field('tracking_number');
|
|
}
|
|
});
|
|
$show->row(function (Show\Row $show) use ($type, $status) {
|
|
$show->width(12)->field('tags')->width(10, 1)->as(function () {
|
|
return $this->tags->pluck('name');
|
|
})->label();
|
|
$show->width(6)->field('created_at');
|
|
$show->field('updated_at');
|
|
});
|
|
|
|
// $show->field('order_product.cover')->image();
|
|
$show->panel()
|
|
->tools(function (Show\Tools $tools) use ($show) {
|
|
$tools->disableEdit();
|
|
$tools->disableDelete();
|
|
if ($show->model()->state == AfterSaleModel::STATE_VERIFY && Admin::user()->can('dcat.admin.after_sales.verify')) {
|
|
$tools->append(new AfterSaleVerify());
|
|
}
|
|
if ($show->model()->state == AfterSaleModel::STATE_SHIPPING && Admin::user()->can('dcat.admin.after_sales.shipping')) {
|
|
//拒绝确认收货
|
|
$tools->append(new AfterSaleShippingFail());
|
|
if ($show->model()->type == AfterSaleModel::TYPE_FILL) {
|
|
//同意确认收货
|
|
$tools->append(new AfterSaleShippingFill());
|
|
} else {
|
|
//同意确认收货
|
|
$tools->append(new AfterSaleShipping());
|
|
}
|
|
}
|
|
if ($show->model()->state == AfterSaleModel::STATE_FINANCE && Admin::user()->can('dcat.admin.after_sales.finance')) {
|
|
if (in_array($show->model()->type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_REFUND])) {
|
|
$tools->append(new AfterSaleFinance());
|
|
} elseif (in_array($show->model()->type, [AfterSaleModel::TYPE_CHANGE])) {
|
|
$tools->append(new AfterSaleFinanceShipping());
|
|
}
|
|
}
|
|
});
|
|
}));
|
|
});
|
|
$row->column(7, function ($column) use ($id) {
|
|
$afterSale = AfterSaleModel::findOrFail($id);
|
|
$builder = AfterSaleModel::with('orderProduct')->where('order_product_id', $afterSale?->order_product_id)->where('id', '<>', $id);
|
|
$column->row(Box::make('相关售后', Grid::make($builder, function (Grid $grid) {
|
|
$grid->column('orderProduct.name');
|
|
$grid->column('num');
|
|
$grid->column('amount')->display(function ($value) {
|
|
if (in_array($this->type, [AfterSaleModel::TYPE_CHANGE, AfterSaleModel::TYPE_FILL])) {
|
|
return '0.00';
|
|
}
|
|
return bcdiv($value, 100, 2);
|
|
})->prepend('¥');
|
|
$grid->column('type')->using([
|
|
AfterSaleModel::TYPE_REFUND_AND_RETURN => '退款退货',
|
|
AfterSaleModel::TYPE_REFUND => '退款',
|
|
AfterSaleModel::TYPE_CHANGE => '换货',
|
|
AfterSaleModel::TYPE_FILL => '漏发',
|
|
])->label();
|
|
$grid->column('state')->using(AfterSaleModel::$stateText)->dot([
|
|
AfterSaleModel::STATE_APPLY=>'warning',
|
|
AfterSaleModel::STATE_VERIFY=>'danger',
|
|
AfterSaleModel::STATE_AGREE=>'warning',
|
|
AfterSaleModel::STATE_SHIPPING=>'primary',
|
|
AfterSaleModel::STATE_FINANCE=>'primary',
|
|
AfterSaleModel::STATE_FINISH=>'success',
|
|
]);
|
|
$grid->column('created_at');
|
|
|
|
$grid->column('id', '操作')->display(function () {
|
|
return '查看';
|
|
})->link(function ($value) {
|
|
return admin_route('after_sales.show', ['after_sale' => $this->id]);
|
|
});
|
|
// $grid->column('remarks');
|
|
// $grid->column('tracking_number');
|
|
|
|
|
|
$grid->disableCreateButton();
|
|
$grid->disableActions();
|
|
$grid->disablePagination();
|
|
$grid->disableRefreshButton();
|
|
})));
|
|
$logs = AfterSaleLog::where('after_sale_id', $id)->latest('id')->get();
|
|
$title = '售后明细';
|
|
$column->row(admin_view('admin.show.timeline', compact('title', 'logs')));
|
|
});
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Make a form builder.
|
|
*
|
|
* @return Form
|
|
*/
|
|
protected function form()
|
|
{
|
|
return Form::make(new AfterSale(), function (Form $form) {
|
|
$form->display('id');
|
|
$form->text('user_id');
|
|
$form->text('order_id');
|
|
$form->text('sn');
|
|
$form->text('order_product_id');
|
|
$form->text('num');
|
|
$form->text('amount');
|
|
$form->text('type');
|
|
$form->text('state');
|
|
$form->text('description');
|
|
$form->text('images');
|
|
$form->text('remarks');
|
|
$form->text('tracking_number');
|
|
|
|
$form->display('created_at');
|
|
$form->display('updated_at');
|
|
});
|
|
}
|
|
}
|