|
@@ -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'),
|