6
0
Fork 0

调整售后补货流程

release
vine_liutk 2021-12-28 11:00:03 +08:00
parent 5ba6a166ae
commit f0be8a6174
8 changed files with 214 additions and 70 deletions

View File

@ -2,13 +2,9 @@
namespace App\Admin\Actions\Show;
use App\Models\AfterSale;
use App\Services\AfterSaleService;
use App\Admin\Forms\AfterSaleShippingFail as AfterSaleShippingFailForm;
use Dcat\Admin\Show\AbstractTool;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
use Dcat\Admin\Widgets\Modal;
class AfterSaleShippingFail extends AbstractTool
{
@ -24,59 +20,13 @@ class AfterSaleShippingFail extends AbstractTool
*/
protected $style = 'btn btn-sm btn-danger';
/**
* 权限判断,如不需要可以删除此方法
*
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
public function render()
{
return $user->can('dcat.admin.after_sales.shipping');
}
/**
* 处理请求,如果不需要接口处理,请直接删除这个方法
*
* @param Request $request
*
* @return Response
*/
public function handle(Request $request)
{
// 获取主键
$key = $this->getKey();
$afterSaleService = new AfterSaleService();
try {
DB::beginTransaction();
$afterSale = AfterSale::where('state', AfterSale::STATE_SHIPPING)->findOrFail($key);
$afterSaleService->shippingFail($afterSale);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
return $this->response()->error('操作失败:'.$th->getMessage());
}
return $this->response()
->success(__('admin.update_succeeded'))
->refresh();
}
public function html()
{
return parent::html().'  ';
}
/**
* 确认弹窗信息,如不需要可以删除此方法
*
* @return string|array|void
*/
public function confirm()
{
return ['是否拒绝收货?', '该操作不可逆,确认后将退回客服审核。'];
$form = AfterSaleShippingFailForm::make()->payload(['id'=>$this->getKey()]);
return Modal::make()
->lg()
->title($this->title)
->body($form)
->button("<a href=\"javascript:void(0)\" class=\"btn btn-sm {$this->style}\">{$this->title}</a>&nbsp;&nbsp;");
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Admin\Actions\Show;
use App\Admin\Forms\AfterSaleShippingFill as AfterSaleShippingFillForm;
use Dcat\Admin\Show\AbstractTool;
use Dcat\Admin\Widgets\Modal;
class AfterSaleShippingFill extends AbstractTool
{
/**
* @return string
*/
protected $title = '<i class="fa fa-exclamation-triangle icon-shuffle"></i>&nbsp;确认补货';
/**
* 按钮样式定义,默认 btn btn-white waves-effect
*
* @var string
*/
protected $style = 'btn btn-sm btn-success';
public function render()
{
$form = AfterSaleShippingFillForm::make()->payload(['id'=>$this->getKey()]);
return Modal::make()
->lg()
->title($this->title)
->body($form)
->button("<a href=\"javascript:void(0)\" class=\"btn btn-sm {$this->style}\">{$this->title}</a>&nbsp;&nbsp;");
}
}

View File

@ -6,6 +6,7 @@ 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;
@ -105,6 +106,7 @@ class AfterSaleController extends AdminController
$show->field('id');
$show->field('sn');
$show->field('order.sn');
$show->field('user.phone');
$show->field('order_product.name');
$show->field('num');
if (in_array($show->model()->type, [AfterSaleModel::TYPE_REFUND_AND_RETURN, AfterSaleModel::TYPE_REFUND])) {
@ -151,8 +153,13 @@ class AfterSaleController extends AdminController
if ($show->model()->state == AfterSaleModel::STATE_SHIPPING) {
//拒绝确认收货
$tools->append(new AfterSaleShippingFail());
//同意确认收货
$tools->append(new AfterSaleShipping());
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])) {

View File

@ -0,0 +1,64 @@
<?php
namespace App\Admin\Forms;
use App\Models\AfterSale;
use App\Services\AfterSaleService;
use Dcat\Admin\Contracts\LazyRenderable;
use Dcat\Admin\Traits\LazyWidget;
use Dcat\Admin\Widgets\Form;
use Illuminate\Support\Facades\DB;
use Throwable;
class AfterSaleShippingFail extends Form implements LazyRenderable
{
use LazyWidget;
/**
* 权限判断,如不需要可以删除此方法
*
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.after_sales.shipping');
}
/**
* Handle the form request.
*
* @param array $input
*
* @return mixed
*/
public function handle(array $input)
{
$afterSaleService = new AfterSaleService();
try {
DB::beginTransaction();
$afterSale = AfterSale::where('state', AfterSale::STATE_SHIPPING)->findOrFail($this->payload['id']);
$afterSaleService->shippingFail($afterSale, $input['remarks']);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
return $this->response()->error('操作失败:'.$th->getMessage());
}
return $this->response()
->success(__('admin.update_succeeded'))
->refresh();
}
/**
* Build a form here.
*/
public function form()
{
$this->text('remarks', '备注')->required();
$this->confirm('是否拒绝通过?', '该操作不可逆,确认后将退回客服审核。');
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Admin\Forms;
use App\Models\AfterSale;
use App\Services\AfterSaleService;
use Dcat\Admin\Contracts\LazyRenderable;
use Dcat\Admin\Traits\LazyWidget;
use Dcat\Admin\Widgets\Form;
use Illuminate\Support\Facades\DB;
use Throwable;
class AfterSaleShippingFill extends Form implements LazyRenderable
{
use LazyWidget;
/**
* 权限判断,如不需要可以删除此方法
*
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.after_sales.shipping');
}
/**
* Handle the form request.
*
* @param array $input
*
* @return mixed
*/
public function handle(array $input)
{
$afterSaleService = new AfterSaleService();
try {
DB::beginTransaction();
$afterSale = AfterSale::where('state', AfterSale::STATE_SHIPPING)->findOrFail($this->payload['id']);
$afterSaleService->shippingFill($afterSale, $input['remarks']);
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
return $this->response()->error('操作失败:'.$th->getMessage());
}
return $this->response()
->success(__('admin.update_succeeded'))
->refresh();
}
/**
* Build a form here.
*/
public function form()
{
$this->text('remarks', '填写补货物流单号')->required();
$this->confirm('是否确认补货完成', '该操作不可逆,确认后将完成该售后单。');
}
}

View File

@ -91,7 +91,7 @@ class AfterSaleVerify extends Form implements LazyRenderable
$defaultRemarks = '同意换货,请填入回寄单号';//需要用户确认并填入回寄单号
break;
case 4:
$defaultRemarks = '同意补货, 新的订单号:';//需要用户收到补货后确认,可后台关闭
$defaultRemarks = '同意补货';//需要用户收到补货后确认,可后台关闭
}
$this->text('remarks3')->value($defaultRemarks);
})

View File

@ -165,6 +165,8 @@ class AfterSale extends Model
if ($afterSale->sn === null) {
$afterSale->sn = self::createSn();
}
});
parent::saved(function ($afterSale) {
//如果取消订单
if ($afterSale->state == self::STATE_CANCEL) {
$afterSale->createCancelLog();

View File

@ -234,6 +234,11 @@ class AfterSaleService
public function agree(AfterSale $afterSale, array $params, $remarks = '用户已同意客服审核结果')
{
if ($this->isWaitAgree($afterSale)) {
AfterSaleLog::create([
'after_sale_id' => $afterSale->id,
'name' => '客户确认',
'desc' => $remarks,
]);
switch ($afterSale->type) {
case AfterSale::TYPE_REFUND_AND_RETURN:
$afterSale->update([
@ -258,15 +263,10 @@ class AfterSaleService
case AfterSale::TYPE_FILL:
$afterSale->update([
'remarks' => $remarks,
'state' => AfterSale::STATE_FINISH,
'state' => AfterSale::STATE_SHIPPING,
]);
break;
}
AfterSaleLog::create([
'after_sale_id' => $afterSale->id,
'name' => '客户确认',
'desc' => $remarks,
]);
return $afterSale;
} else {
throw new BizException('售后订单状态异常,请稍后再试');
@ -280,7 +280,7 @@ class AfterSaleService
* @param string $remarks
* @return void
*/
public function shippingFail(AfterSale $afterSale, $remarks ='物流收货未通过')
public function shippingFail(AfterSale $afterSale, $remarks ='仓库验收未通过')
{
if ($this->isWaitShipping($afterSale)) {
$afterSale->update([
@ -297,6 +297,31 @@ class AfterSaleService
}
}
/**
* 物流补货
*
* @param AfterSale $afterSale
* @param string $remarks
* @return void
*/
public function shippingFill(AfterSale $afterSale, $remarks)
{
$remarks = '补货完成,新的物流单号:'.$remarks;
if ($this->isWaitShipping($afterSale)) {
AfterSaleLog::create([
'after_sale_id' => $afterSale->id,
'name' => '仓库审核',
'desc' => $remarks,
]);
$afterSale->update([
'state' => $afterSale::STATE_FINISH,
'remarks' => $remarks,
]);
} else {
throw new BizException('该售后订单状态异常');
}
}
/**
* 物流确认收货
*
@ -304,7 +329,7 @@ class AfterSaleService
* @param string $remarks
* @return void
*/
public function shipping(AfterSale $afterSale, $remarks ='物流确认收货')
public function shipping(AfterSale $afterSale, $remarks ='仓库验收通过')
{
if ($this->isWaitShipping($afterSale)) {
$afterSale->update([