6
0
Fork 0

调整用户同意售后单时状态问题

release
vine_liutk 2021-12-15 11:52:24 +08:00
parent 05b202303c
commit 0e18208c1e
6 changed files with 126 additions and 28 deletions

View File

@ -0,0 +1,82 @@
<?php
namespace App\Admin\Actions\Show;
use App\Models\AfterSale;
use App\Services\AfterSaleService;
use Dcat\Admin\Show\AbstractTool;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class AfterSaleFinanceShipping 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-danger';
/**
* 权限判断,如不需要可以删除此方法
*
* @param Model|Authenticatable|HasPermissions|null $user
*
* @return bool
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.after_sales.finance');
}
/**
* 处理请求,如果不需要接口处理,请直接删除这个方法
*
* @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_FINANCE)->findOrFail($key);
$afterSaleService->finance($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().'&nbsp;&nbsp;';
}
/**
* 确认弹窗信息,如不需要可以删除此方法
*
* @return string|array|void
*/
public function confirm()
{
return ['是否确认发货?', '该操作不可逆,确认后将产生新的订单以及发货包裹单。'];
}
}

View File

@ -3,6 +3,7 @@
namespace App\Admin\Controllers;
use App\Admin\Actions\Show\AfterSaleFinance;
use App\Admin\Actions\Show\AfterSaleFinanceShipping;
use App\Admin\Actions\Show\AfterSaleShipping;
use App\Admin\Actions\Show\AfterSaleVerify;
use App\Admin\Repositories\AfterSale;
@ -31,7 +32,12 @@ class AfterSaleController extends AdminController
$grid->column('sn');
$grid->column('orderProduct.name');
$grid->column('num');
$grid->column('amount');
$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 => '退款',
@ -100,6 +106,11 @@ class AfterSaleController extends AdminController
$show->field('order.sn');
$show->field('order_product.name');
$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 => '退款',
@ -136,7 +147,11 @@ class AfterSaleController extends AdminController
$tools->append(new AfterSaleShipping());
}
if ($show->model()->state == AfterSaleModel::STATE_FINANCE) {
$tools->append(new AfterSaleFinance());
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());
}
}
});
}));

View File

@ -40,7 +40,7 @@ class AfterSaleVerify extends Form implements LazyRenderable
DB::beginTransaction();
$afterSale = AfterSale::where('state', AfterSale::STATE_VERIFY)->findOrFail($this->payload['id']);
if ($input['state'] == 3) {//审核通过
$afterSaleService->verify($afterSale, $input['remarks3']);
$afterSaleService->verify($afterSale, $input['remarks3'], (int) $input['amount']);
} elseif ($input['state'] == 1) {//需要补充资料
$afterSaleService->backApply($afterSale, $input['remarks1']);
}
@ -63,8 +63,12 @@ class AfterSaleVerify extends Form implements LazyRenderable
{
$id = $this->payload['id'] ?? 0;
$afterSale = AfterSale::findOrFail($id);
if (!in_array($afterSale->type, [3, 4])) {
$this->currency('amount')->symbol('¥')->value($afterSale->amount);
if (in_array($afterSale->type, [1, 2])) {
$this->currency('amount')->customFormat(function () use ($afterSale) {
return bcdiv($afterSale->amount, 100, 2);
})->saving(function ($amount) {
return bcmul($amount, 100);
})->symbol('¥');
}
$this->radio('state')
@ -72,13 +76,13 @@ class AfterSaleVerify extends Form implements LazyRenderable
$defaultRemarks = '';
switch ($afterSale->type) {
case 1:
$defaultRemarks = '同意退款退货';//需要用户确认并填入回寄单号
$defaultRemarks = '同意退款退货, 请确认退款金额,并填入回寄单号';//需要用户确认并填入回寄单号
break;
case 2:
$defaultRemarks = '同意退款,等待财务打款审核。';
$defaultRemarks = '同意退款,请确认退款金额。';
break;
case 3:
$defaultRemarks = '同意换货';//需要用户确认并填入回寄单号
$defaultRemarks = '同意换货,请填入回寄单号';//需要用户确认并填入回寄单号
break;
case 4:
$defaultRemarks = '同意补货, 新的订单号:';//需要用户收到补货后确认,可后台关闭

View File

@ -64,6 +64,9 @@ class AfterSaleController extends Controller
$afterSale = $afterSaleService->create($request->user(), $orderProduct, $input['type'], $input['num'], $input);
DB::commit();
} catch (BizException $th) {
DB::rollBack();
throw new BizException($th->getMessage());
} catch (Throwable $th) {
DB::rollBack();
report($th);

View File

@ -29,7 +29,7 @@ class AfterSale extends Model
protected $casts = [
'images' => JsonArray::class,
'amount' => Price::class,
// 'amount' => Price::class,
];
protected $fillable = [

View File

@ -28,7 +28,7 @@ class AfterSaleService
// }
//校验该订单商品不能有已完成、处理中的售后记录
if (AfterSale::where('order_product_id', $orderProduct->id)->where('state', '<', AfterSale::STATE_FINISH)->exists()) {
if (AfterSale::where('order_product_id', $orderProduct->id)->where('state', '<', AfterSale::STATE_CANCEL)->exists()) {
throw new BizException('该订单商品已申请售后');
}
//校验申请数量不能超过订单商品数量
@ -36,18 +36,8 @@ class AfterSaleService
throw new BizException('申请售后的数量不能大于订单商品数量');
}
// switch ($type) {
// case 3:
// $amount = 0;
// break;
// case 4:
// $amount = 0;
// break;
// default:
// dd(bcmul(bcdiv(10, 3, 2), 3, 2));如果数量相等,则直接取总额
$amount = ($num == $orderProduct->quantity) ? $orderProduct->total_amount : bcmul(bcdiv($orderProduct->total_amount, $orderProduct->quantity, 2), $num, 2);
// break;
// }
$amount = ($num == $orderProduct->quantity) ? $orderProduct->total_amount : bcmul(bcdiv($orderProduct->total_amount, $orderProduct->quantity), $num);
$afterSale = AfterSale::create(array_merge($params, [
'user_id' => $user->id,
'order_id' => $orderProduct->order_id,
@ -145,12 +135,13 @@ class AfterSaleService
* @param string $remarks
* @return void
*/
public function verify(AfterSale $afterSale, string $remarks)
public function verify(AfterSale $afterSale, string $remarks, int $amount)
{
if ($this->isWaitVerify($afterSale)) {
switch ($afterSale->type) {
case AfterSale::TYPE_REFUND_AND_RETURN:
$afterSale->update([
'amount' => $amount,
'state' => $afterSale::STATE_AGREE,
'remarks' => $remarks,
]);
@ -162,6 +153,7 @@ class AfterSaleService
break;
case AfterSale::TYPE_REFUND:
$afterSale->update([
'amount' => $amount,
'state' => $afterSale::STATE_AGREE,
'remarks' => $remarks,
]);
@ -242,10 +234,9 @@ class AfterSaleService
break;
case AfterSale::TYPE_CHANGE:
$afterSale->update([
'remarks' => $remarks.',已为您生成新订单,请注意查收。',
'state' => AfterSale::STATE_FINISH,
'remarks' => $remarks,
'state' => AfterSale::STATE_SHIPPING,
]);
//todo - 生成新订单以及发货单;
break;
case AfterSale::TYPE_FILL:
$afterSale->update([
@ -297,8 +288,11 @@ class AfterSaleService
public function finance(AfterSale $afterSale, $remarks ='退款成功')
{
if ($this->isWaitFinance($afterSale)) {
//todo-执行实际退款操作;
if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND])) {
//todo-执行实际退款操作;
} elseif (in_array($afterSale->type, [AfterSale::TYPE_CHANGE])) {//换货流程
//todo-执行生成新的订单,发货单操作;
}
AfterSaleLog::create([
'after_sale_id' => $afterSale->id,