6
0
Fork 0
jiqu-library-server/app/Admin/Controllers/AfterSaleController.php

293 lines
13 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(4, 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');
$show->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($show->model()->type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_REFUND])) {
$show->field('amount', '售后金额')->as(function ($amount) {
return '¥'.bcdiv($amount, 100, 2);
});
}
$show->field('type')->using([
AfterSaleModel::TYPE_REFUND_AND_RETURN => '退款退货',
AfterSaleModel::TYPE_REFUND => '退款',
AfterSaleModel::TYPE_CHANGE => '换货',
AfterSaleModel::TYPE_FILL => '漏发',
])->label();
$show->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',
]);
$show->field('user.user_info.nickname', '下单用户');
$show->field('user.phone');
if (in_array($show->model()->type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_CHANGE])) {
$show->field('tracking_number');
}
$show->field('tags')->as(function () {
return $this->tags->pluck('name');
})->label();
if (in_array($show->model()->type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_REFUND, AfterSaleModel::TYPE_CHANGE])) {
$show->field('sales_value', '销售值');
}
// $show->field('order_product.cover')->image();
$show->field('created_at');
$show->field('updated_at');
$show->panel()
->tools(function (Show\Tools $tools) use ($show) {
$tools->disableEdit();
$tools->disableDelete();
if ($show->model()->state == AfterSaleModel::STATE_VERIFY) {
$tools->append(new AfterSaleVerify());
}
if ($show->model()->state == AfterSaleModel::STATE_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) {
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(8, 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');
});
}
}