From 2557525384d91f192b568d9371b55c25bf81e0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9D=99?= Date: Mon, 20 Dec 2021 13:23:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Order/OrderController.php | 29 +++++++++++++- app/Models/Order.php | 16 ++++++-- app/Models/OrderRefundTask.php | 28 ++++++++++++++ ...113756_create_order_refund_tasks_table.php | 38 +++++++++++++++++++ 4 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 app/Models/OrderRefundTask.php create mode 100644 database/migrations/2021_12_20_113756_create_order_refund_tasks_table.php diff --git a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php index eaade270..db9c1681 100644 --- a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php +++ b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php @@ -7,6 +7,7 @@ use App\Endpoint\Api\Http\Resources\OrderResource; use App\Endpoint\Api\Http\Resources\OrderResourceCollection; use App\Exceptions\BizException; use App\Helpers\Paginator as PaginatorHelper; +use App\Models\Order; use App\Services\OrderService; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\Request; @@ -142,7 +143,33 @@ class OrderController extends Controller */ public function cancel($id, Request $request) { - // todo 取消订单 + $user = $request->user(); + + try { + return DB::transaction(function () use ($id, $user) { + $order = $user->orders()->lockForUpdate()->findOrFail($id); + + if (! $order->isPending() && ! $order->isWaitShipping()) { + throw new BizException('订单状态不是待付款或待发货'); + } + + if ($order->isWaitShipping()) { + $order->refundTasks()->create([ + 'amount' => $order->total_amount, + ]); + } + + $order->update([ + 'status' => Order::STATUS_CANCELLED, + ]); + }); + } catch (BizException $e) { + throw $e; + } catch (Throwable $e) { + report($e); + + throw new BizException('订单支付失败,请重试'); + } return response()->noContent(); } diff --git a/app/Models/Order.php b/app/Models/Order.php index 13481cba..9e2e6061 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -77,6 +77,15 @@ class Order extends Model 'completed_at', ]; + /** + * 仅查询支付过期的订单 + */ + public function scopeExpired() + { + return $this->where('status', static::STATUS_PENDING) + ->where('created_at', '<=', now()->subSeconds(config('settings.order_payment_expires_at'))); + } + /** * 下单人 * @@ -114,12 +123,11 @@ class Order extends Model } /** - * 仅查询支付过期的订单 + * 属于此订单的退款任务 */ - public function scopeExpired() + public function refundTasks() { - return $this->where('status', static::STATUS_PENDING) - ->where('created_at', '<=', now()->subSeconds(config('settings.order_payment_expires_at'))); + return $this->hasMany(OrderRefundTask::class); } /** diff --git a/app/Models/OrderRefundTask.php b/app/Models/OrderRefundTask.php new file mode 100644 index 00000000..e77d066b --- /dev/null +++ b/app/Models/OrderRefundTask.php @@ -0,0 +1,28 @@ + self::STATUS_PENDING, + ]; + + /** + * @var array + */ + protected $fillable = [ + 'order_id', + 'after_sale_id', + 'amount', + 'status', + 'failed_reason', + ]; +} diff --git a/database/migrations/2021_12_20_113756_create_order_refund_tasks_table.php b/database/migrations/2021_12_20_113756_create_order_refund_tasks_table.php new file mode 100644 index 00000000..523669e8 --- /dev/null +++ b/database/migrations/2021_12_20_113756_create_order_refund_tasks_table.php @@ -0,0 +1,38 @@ +id(); + $table->unsignedBigInteger('order_id')->comment('订单ID'); + $table->unsignedBigInteger('after_sale_id')->nullable()->comment('售后ID'); + $table->unsignedBigInteger('amount')->comment('退款金额'); + $table->tinyInteger('status')->default(0)->comment('状态'); + $table->string('failed_reason')->nullable()->comment('失败原因'); + $table->timestamps(); + + $table->unique(['order_id', 'after_sale_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order_refund_tasks'); + } +}