Browse Source

feat: 添加订单删除功能及相关状态

在OrderController中新增删除订单的API接口,并在OrderService中实现删除订单的业务逻辑。更新OrderRecordStatus枚举,添加已接单和已删除状态。此更改允许用户删除订单,并确保订单状态管理更加完善,提升了用户体验。
刘学玺 2 months ago
parent
commit
290b44cc69

+ 13 - 1
app/Enums/OrderRecordStatus.php

@@ -73,7 +73,7 @@ enum OrderRecordStatus: int
     case REFUNDED = 13;
 
     /**
-     * 记录状态��更换技师
+     * 记录状态更换技师
      */
     case CHANGE_COACH = 14;
 
@@ -92,6 +92,16 @@ enum OrderRecordStatus: int
      */
     case ALARM_HANDLED = 17;
 
+    /**
+     * 记录状态:已接单
+     */
+    case ACCEPTED = 18;
+
+    /**
+     * 记录状态:已删除
+     */
+    case DELETED = 19;
+
     /**
      * 获取状态的显示文本
      *
@@ -117,6 +127,8 @@ enum OrderRecordStatus: int
             self::RESET_COACH => '重置技师',
             self::TEMPORARY_ACCEPTED => '平台临时接单',
             self::ALARM_HANDLED => '报警已处理',
+            self::ACCEPTED => '已接单',
+            self::DELETED => '已删除',
         };
     }
 }

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

@@ -447,4 +447,32 @@ class OrderController extends Controller
         $this->service->rateOrder(Auth::user()->id, $validated);
         return $this->success(null, '评价成功');
     }
+
+    /**
+     * [订单]删除订单
+     *
+     * 用户删除订单,删除后订单将不在列表中显示
+     *
+     * @authenticated
+     *
+     * @urlParam id required 订单ID. Example: 1
+     *
+     * @response {
+     *   "status": "success",
+     *   "message": "订单删除成功",
+     *   "data": null
+     * }
+     *
+     * @response 404 {
+     *   "message": "订单不存在"
+     * }
+     *
+     * @response 422 {
+     *   "message": "当前订单状态不允许删除"
+     * }
+     */
+    public function delete($id)
+    {
+        return $this->success($this->service->deleteOrder(Auth::user()->id, $id));
+    }
 }

+ 56 - 0
app/Services/Client/OrderService.php

@@ -3086,4 +3086,60 @@ readonly class OrderService
         // 组合退款单号:前缀 + 时间戳 + 订单ID后缀 + 随机数
         return "RF{$timestamp}{$orderIdSuffix}{$random}";
     }
+
+    /**
+     * 用户删除订单
+     *
+     * 业务逻辑:
+     * 1. 验证订单是否存在且属于当前用户
+     * 2. 验证订单状态是否允许删除(已完成、已取消等)
+     * 3. 更新订单的user_deleted_at字段
+     * 4. 记录删除操作
+     *
+     * @param int $userId 用户ID
+     * @param int $orderId 订单ID
+     * @return array
+     * @throws \Exception
+     */
+    public function deleteOrder(int $userId, int $orderId): array
+    {
+        return DB::transaction(function () use ($userId, $orderId) {
+            // 验证订单是否存在且属于当前用户
+            $order = Order::where('id', $orderId)
+                ->where('user_id', $userId)
+                ->whereNull('user_deleted_at')  // 确保订单未被用户删除
+                ->first();
+
+            abort_if(!$order, 404, '订单不存在');
+
+            // 验证订单状态是否允许删除
+            // 允许删除未支付、已完成、已取消、已退款等状态的订单
+            $allowedStates = [
+                OrderStatus::CREATED->value,    // 未支付
+                OrderStatus::COMPLETED->value,  // 已完成
+                OrderStatus::CANCELLED->value,  // 已取消
+                OrderStatus::REFUNDED->value,   // 已退款
+            ];
+
+            abort_if(!in_array($order->state, $allowedStates), 422, '当前订单状态不允许删除');
+
+            // 标记订单为用户已删除
+            $order->update([
+                'user_deleted_at' => now()
+            ]);
+
+            // 创建订单记录
+            $this->createOrderRecord(
+                $order,
+                $userId,
+                'user',
+                OrderRecordStatus::DELETED,
+                '用户删除订单'
+            );
+
+            return [
+                'message' => '订单删除成功'
+            ];
+        });
+    }
 }

+ 3 - 0
routes/api.php

@@ -146,6 +146,9 @@ Route::prefix('client')->group(function () {
 
             // 评价
             Route::post('rate', [OrderController::class, 'rate'])->name('client.order.rate');
+
+            // 用户删除订单
+            Route::delete('{id}', [OrderController::class, 'delete'])->name('client.order.delete');
         });
 
         // 团队管理路由