diff --git a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php index 46a591d4..da756b0a 100644 --- a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php +++ b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php @@ -104,4 +104,24 @@ class OrderController extends Controller return OrderSimpleResource::make($order); } + + /** + * 取消订单 + * + * @param int $id + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\JsonResponse + */ + public function cancel($id, Request $request) + { + $order = $request->user()->orders()->findOrFail($id); + + if (! $order->isCancelable()) { + throw new BizException('订单无法取消'); + } + + $order->markAsCancelled(); + + return response()->noContent(); + } } diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index 88d71491..8d71012f 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -111,6 +111,7 @@ Route::group([ // 订单 Route::apiResource('order/orders', OrderController::class); + Route::post('order/orders/{order}/cancel', [OrderController::class, 'cancel']); Route::post('order/verify-order', OrderVerifyController::class); }); }); diff --git a/app/Models/Order.php b/app/Models/Order.php index 15472054..006f7d02 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -57,6 +57,28 @@ class Order extends Model return $this->hasMany(OrderProduct::class); } + /** + * 确认此订单是否可以被取消 + * + * @return bool + */ + public function isCancelable(): bool + { + return in_array($this->status, [static::STATUS_PENDING, static::STATUS_PAID]); + } + + /** + * 将订单标记未已取消 + * + * @return void + */ + public function markAsCancelled(): void + { + $this->forceFill([ + 'status' => static::STATUS_CANCELLED, + ])->save(); + } + /** * 获取订单支付金额 * diff --git a/resources/lang/zh_CN/models.php b/resources/lang/zh_CN/models.php index 6c64436d..94dc07b3 100644 --- a/resources/lang/zh_CN/models.php +++ b/resources/lang/zh_CN/models.php @@ -1,5 +1,6 @@ '地址', ProductSpu::class => '商品', ProductSku::class => '商品', + Order::class => '订单', ShoppingCartItem::class => '商品', UserCoupon::class => '优惠券', Zone::class => '地区',