|
@@ -2761,4 +2761,110 @@ readonly class OrderService
|
|
|
|
|
|
return $order;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 评价订单
|
|
|
+ *
|
|
|
+ * @param int $userId 用户ID
|
|
|
+ * @param array $data 评价数据
|
|
|
+ * @throws \Exception
|
|
|
+ */
|
|
|
+ public function rateOrder(int $userId, array $data): void
|
|
|
+ {
|
|
|
+ $order = Order::where('user_id', $userId)
|
|
|
+ ->where('id', $data['order_id'])
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$order) {
|
|
|
+ throw new \Exception('订单不存在');
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($order->status !== OrderStatus::LEFT->value) {
|
|
|
+ throw new \Exception('订单状态不正确');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证评分范围
|
|
|
+ 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之间');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::transaction(function () use ($order, $data, $userId) {
|
|
|
+ // 创建评价记录
|
|
|
+ $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,
|
|
|
+ 'tags' => $data['tags'] ?? [],
|
|
|
+ 'content' => $data['content'] ?? '',
|
|
|
+ 'images' => $data['images'] ?? [],
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 更新订单状态为已完成
|
|
|
+ $order->update(['status' => OrderStatus::COMPLETED->value]);
|
|
|
+
|
|
|
+ // 更新技师评分
|
|
|
+ // $this->updateCoachScore($order->coach_id);
|
|
|
+
|
|
|
+ // 记录订单状态变更
|
|
|
+ OrderRecord::create([
|
|
|
+ 'order_id' => $order->id,
|
|
|
+ 'object_id' => $userId,
|
|
|
+ 'object_type' => MemberUser::class,
|
|
|
+ 'state' => OrderRecordStatus::EVALUATED->value,
|
|
|
+ 'remark' => '用户完成评价',
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新技师评分
|
|
|
+ *
|
|
|
+ * @param int $coachId 技师ID
|
|
|
+ */
|
|
|
+ private function updateCoachScore(int $coachId): void
|
|
|
+ {
|
|
|
+ $coach = CoachUser::find($coachId);
|
|
|
+ if (!$coach) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算技师的各维度平均分
|
|
|
+ $avgScores = DB::table('order_comments')
|
|
|
+ ->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);
|
|
|
+ })
|
|
|
+ ->select([
|
|
|
+ DB::raw('AVG(service_score) as avg_service_score'),
|
|
|
+ DB::raw('AVG(appearance_score) as avg_appearance_score'),
|
|
|
+ DB::raw('AVG(attitude_score) as avg_attitude_score'),
|
|
|
+ DB::raw('AVG(professional_score) as avg_professional_score')
|
|
|
+ ])
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if ($avgScores) {
|
|
|
+ // 计算总体平均分
|
|
|
+ $overallScore = round(($avgScores->avg_service_score +
|
|
|
+ $avgScores->avg_appearance_score +
|
|
|
+ $avgScores->avg_attitude_score +
|
|
|
+ $avgScores->avg_professional_score) / 4, 1);
|
|
|
+
|
|
|
+ // 更新技师评分
|
|
|
+ $coach->update([
|
|
|
+ 'score' => $overallScore,
|
|
|
+ 'service_score' => round($avgScores->avg_service_score, 1),
|
|
|
+ 'appearance_score' => round($avgScores->avg_appearance_score, 1),
|
|
|
+ 'attitude_score' => round($avgScores->avg_attitude_score, 1),
|
|
|
+ 'professional_score' => round($avgScores->avg_professional_score, 1)
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|