Kaynağa Gözat

refactor: 优化订单评级逻辑,增强错误处理和状态检查
- 使用abort_if替代异常抛出,简化错误处理流程
- 确保订单状态和用户权限的检查更加严谨
- 更新订单状态字段为state,保持一致性
- 改进评分字段的处理,确保类型一致性

刘学玺 3 ay önce
ebeveyn
işleme
694f1b2f0b
1 değiştirilmiş dosya ile 24 ekleme ve 18 silme
  1. 24 18
      app/Services/Client/OrderService.php

+ 24 - 18
app/Services/Client/OrderService.php

@@ -2767,26 +2767,32 @@ readonly class OrderService
      *
      * @param int $userId 用户ID
      * @param array $data 评价数据
-     * @throws \Exception
      */
     public function rateOrder(int $userId, array $data): void
     {
-        $order = Order::where('user_id', $userId)
+        // 查找订单并加载关联数据
+        $order = Order::query()
+            ->where('user_id', $userId)
             ->where('id', $data['order_id'])
             ->first();
 
-        if (!$order) {
-            throw new \Exception('订单不存在');
-        }
+        // 检查订单是否存在
+        abort_if(!$order, 404, sprintf('订单[%d]不存在', $data['order_id']));
 
-        if ($order->status !== OrderStatus::LEFT->value) {
-            throw new \Exception('订单状态不正确');
-        }
+        // 检查订单是否属于当前用户
+        abort_if((int)$order->user_id !== $userId, 403, '无权评价此订单');
+
+        // 检查订单状态 - 确保类型一致性比较
+        abort_if((int)$order->state !== OrderStatus::LEFT->value, 400, sprintf('订单状态为[%s],不允许评价', $order->state));
+
+        // 检查是否已评价
+        abort_if($order->comments()->exists(), 400, '订单已评价');
 
         // 验证评分范围
         foreach (['service_score', 'appearance_score', 'attitude_score', 'professional_score'] as $scoreField) {
-            if (isset($data[$scoreField]) && ($data[$scoreField] < 1 || $data[$scoreField] > 5)) {
-                throw new \Exception('评分范围必须在1-5之间');
+            if (isset($data[$scoreField])) {
+                $score = (float)$data[$scoreField];
+                abort_if($score < 1 || $score > 5, 400, '评分范围必须在1-5之间');
             }
         }
 
@@ -2795,17 +2801,17 @@ readonly class OrderService
             $comment = $order->comments()->create([
                 'user_id' => $userId,
                 'coach_id' => $order->coach_id,
-                'service_score' => $data['service_score'] ?? 5,
-                'appearance_score' => $data['appearance_score'] ?? 5,
-                'attitude_score' => $data['attitude_score'] ?? 5,
-                'professional_score' => $data['professional_score'] ?? 5,
+                'service_score' => isset($data['service_score']) ? (float)$data['service_score'] : 5.0,
+                'appearance_score' => isset($data['appearance_score']) ? (float)$data['appearance_score'] : 5.0,
+                'attitude_score' => isset($data['attitude_score']) ? (float)$data['attitude_score'] : 5.0,
+                'professional_score' => isset($data['professional_score']) ? (float)$data['professional_score'] : 5.0,
                 'tags' => $data['tags'] ?? [],
                 'content' => $data['content'] ?? '',
                 'images' => $data['images'] ?? [],
             ]);
 
             // 更新订单状态为已完成
-            $order->update(['status' => OrderStatus::COMPLETED->value]);
+            $order->update(['state' => OrderStatus::COMPLETED->value]);
 
             // 更新技师评分
             // $this->updateCoachScore($order->coach_id);
@@ -2838,9 +2844,9 @@ readonly class OrderService
             ->where('coach_id', $coachId)
             ->whereExists(function ($query) {
                 $query->select(DB::raw(1))
-                    ->from('orders')
-                    ->whereColumn('order_comments.order_id', 'orders.id')
-                    ->where('orders.status', OrderStatus::COMPLETED->value);
+                    ->from('order')
+                    ->whereColumn('order_comments.order_id', 'order.id')
+                    ->where('order.state', OrderStatus::COMPLETED->value);
             })
             ->select([
                 DB::raw('AVG(service_score) as avg_service_score'),