Browse Source

feat: 实现订单删除功能

在OrderController中新增删除订单的API接口,并在OrderService中实现相应的业务逻辑。该功能允许技师删除订单,确保订单状态管理更加完善,提升了用户体验。包括对订单存在性和状态的验证,确保删除操作的安全性和有效性。
刘学玺 3 months ago
parent
commit
6ac4e0ae73

+ 28 - 0
app/Http/Controllers/Coach/OrderController.php

@@ -377,4 +377,32 @@ class OrderController extends Controller
             $this->service->getOrderSettings(Auth::user()->coach)
         );
     }
+
+    /**
+     * [订单]删除订单
+     *
+     * @description 技师删除订单,删除后订单将不在技师的订单列表中显示
+     *
+     * @authenticated
+     *
+     * @urlParam order_id integer required 订单ID Example: 1
+     *
+     * @response {
+     *   "status": true,
+     *   "message": "订单删除成功",
+     *   "data": null
+     * }
+     *
+     * @response 404 {
+     *   "message": "订单不存在"
+     * }
+     *
+     * @response 422 {
+     *   "message": "当前订单状态不允许删除"
+     * }
+     */
+    public function delete(int $order_id)
+    {
+        return $this->success($this->service->deleteOrder(Auth::user()->id, $order_id));
+    }
 }

+ 62 - 0
app/Services/Coach/OrderService.php

@@ -24,6 +24,7 @@ use App\Enums\TechnicianLocationType;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Redis;
 use App\Enums\PaymentMethod;
+use App\Models\Coach;
 
 class OrderService
 {
@@ -78,12 +79,17 @@ class OrderService
 
     /**
      * 获取技师订单列表
+     *
+     * @param int $coachId 技师ID
+     * @param array $params 查询参数
+     * @return array
      */
     public function getOrderList(int $coachId, array $params = [])
     {
         // 1. 构建基础查询
         $query = Order::query()
             ->where('coach_id', $coachId)
+            ->whereNull('coach_deleted_at')  // 不显示技师已删除的订单
             ->whereNotIn('state', [
                 OrderStatus::CREATED->value,    // 排除未支付订单
                 OrderStatus::ASSIGNED->value,   // 排除已分配状态订单
@@ -1185,4 +1191,60 @@ class OrderService
             ],
         ];
     }
+
+    /**
+     * 技师删除订单
+     *
+     * 业务逻辑:
+     * 1. 验证订单是否存在且分配给当前技师
+     * 2. 验证订单状态是否允许删除(已完成、已取消等)
+     * 3. 更新订单的coach_deleted_at字段
+     * 4. 记录删除操作
+     *
+     * @param int $coachId 技师ID
+     * @param int $orderId 订单ID
+     * @return array
+     * @throws \Exception
+     */
+    public function deleteOrder(int $coachId, int $orderId): array
+    {
+        return DB::transaction(function () use ($coachId, $orderId) {
+            // 验证订单是否存在且分配给当前技师
+            $order = Order::where('id', $orderId)
+                ->where('coach_id', $coachId)
+                ->whereNull('coach_deleted_at')  // 确保订单未被技师删除
+                ->first();
+
+            abort_if(!$order, 404, '订单不存在');
+
+            // 验证订单状态是否允许删除
+            // 允许删除已完成、已取消、已退款等状态的订单
+            $allowedStates = [
+                OrderStatus::COMPLETED->value,  // 已完成
+                OrderStatus::CANCELLED->value,  // 已取消
+                OrderStatus::REFUNDED->value,   // 已退款
+                OrderStatus::REJECTED->value,   // 已拒单
+            ];
+
+            abort_if(!in_array($order->state, $allowedStates), 422, '当前订单状态不允许删除');
+
+            // 标记订单为技师已删除
+            $order->update([
+                'coach_deleted_at' => now()
+            ]);
+
+            // 创建订单记录
+            OrderRecord::create([
+                'order_id' => $order->id,
+                'object_id' => $coachId,
+                'object_type' => CoachUser::class,
+                'state' => OrderRecordStatus::DELETED->value,
+                'remark' => '技师删除订单'
+            ]);
+
+            return [
+                'message' => '订单删除成功'
+            ];
+        });
+    }
 }

+ 2 - 0
routes/api.php

@@ -252,6 +252,8 @@ Route::middleware(['auth:sanctum', 'coach'])->prefix('coach')->group(function ()
         Route::post('settings', [CoachOrderController::class, 'setOrder'])->name('coach.orders.settings'); // 订单设置
         // 获取订单设置
         Route::get('settings', [CoachOrderController::class, 'getOrderSettings'])->name('coach.orders.get-settings');
+        // 技师删除订单
+        Route::delete('/{order_id}', [CoachOrderController::class, 'delete'])->name('coach.orders.delete');
     });
 
     // 项目相关路由