Browse Source

fixed:技师端-优化订单设置

刘学玺 4 months ago
parent
commit
f3746b3b1a
2 changed files with 56 additions and 48 deletions
  1. 15 10
      app/Http/Controllers/Coach/OrderController.php
  2. 41 38
      app/Services/Coach/OrderService.php

+ 15 - 10
app/Http/Controllers/Coach/OrderController.php

@@ -314,28 +314,33 @@ class OrderController extends Controller
     /**
      * [订单]订单设置
      *
-     * @return JsonResponse
-     *
      * @description 更新技师的订单相关设置,如服务距离等
      *
-     * @bodyParam distance float 服务距离(公里) Example: 10
+     * @authenticated 需要技师身份认证
      *
-     * @response {
+     * @bodyParam distance float required 服务距离(公里) Example: 10
+     *
+     * @response 200 {
+     *   "status": true,
      *   "message": "订单设置更新成功",
-     *   "coach_id": 1,
-     *   "settings": {
-     *     "distance": 10
+     *   "data": {
+     *     "distance": 10,              // 当前服务距离(公里)
+     *     "distance_max": 40,          // 最大服务距离限制(公里)
+     *     "distance_min": 1            // 最小服务距离限制(公里)
      *   }
      * }
+     * @response 422 {
+     *   "message": "服务距离不能超过40公里"
+     * }
      */
     public function setOrder(Request $request)
     {
-        $data = $request->validate([
-            'distance' => 'nullable|numeric|min:0',
+        $validated = $request->validate([
+            'distance' => 'required|numeric|min:0',  // 服务距离必填且为非负数
         ]);
 
         return $this->success(
-            $this->service->setOrder(Auth::user()->id, $data)
+            $this->service->setOrder(Auth::user()->coach, $validated)
         );
     }
 

+ 41 - 38
app/Services/Coach/OrderService.php

@@ -451,7 +451,7 @@ class OrderService
                 $order->state = OrderStatus::ACCEPTED->value;
                 $order->save();
 
-                // 清技师相关缓存
+                // 清���技师相关缓存
                 $this->clearCoachCache($coach->id, $order->service_time);
 
                 // 记录日志
@@ -1008,50 +1008,53 @@ class OrderService
     }
 
     /**
-     * 订单设置
+     * 更新订单设置
      *
-     * @param  int  $userId  技师用户ID
-     * @param  array  $data  订单设置数据
-     * @return array
+     * 业务流程:
+     * 1. 获取订单配置项
+     * 2. 验证服务距离范围
+     * 3. 更新技师设置
+     * 4. 返回最新设置
      *
-     * @throws \Exception
+     * @param CoachUser $coach 技师对象
+     * @param array $data 设置数据,包含:
+     *        - distance: float 服务距离(公里)
+     * @return array 返回最新设置信息
+     * @throws \Exception 当更新失败时抛出异常
      */
-    public function setOrder(int $userId, array $data)
+    public function setOrder(CoachUser $coach, array $data): array
     {
+        return DB::transaction(function () use ($coach, $data) {
+            // 获取订单距离配置项
+            $distanceItem = SettingGroup::where('code', 'order')
+                ->firstOrFail()
+                ->items()
+                ->where('code', 'distance')
+                ->firstOrFail();
+
+            // 验证服务距离范围
+            $distance = (float)$data['distance'];
+            abort_if(
+                $distance > $distanceItem->max_value || $distance < $distanceItem->min_value,
+                422,
+                sprintf('服务距离必须在 %.1f-%.1f 公里之间', $distanceItem->min_value, $distanceItem->max_value)
+            );
 
-        return DB::transaction(function () use ($userId, $data) {
-
-            // 获取技师信息
-            $user = MemberUser::with(['coach'])->findOrFail($userId);
-            $coach = $user->coach;
-            abort_if(! $coach, 404, '技师信息不存在');
-
-            // 获取订单配置分组
-            $settingGroup = SettingGroup::where('code', 'order')->first();
-            abort_if(! $settingGroup, 404, '订单配置分组不存在');
-
-            // 获取距离配置项
-            $distanceSettingItem = $settingGroup->items()->where('code', 'distance')->first();
-            abort_if(! $distanceSettingItem, 404, '距离配置项不存在');
-
-            // 检查服务距离是否存在,并且是否大于0
-            if (isset($data['distance']) && $data['distance'] > 0) {
-                // 从全局配置中验证服务距离的合理范围
-                abort_if($data['distance'] > $distanceSettingItem->max_value, 422, '服务距离不能超过' . $distanceSettingItem->max_value . '公里');
-
-                // 更新技师服务距离配置
-                $coach->settingValues()->updateOrCreate(
-                    ['item_id' => $distanceSettingItem->id],
-                    ['value' => $data['distance']],
-                    ['object_type' => $coach::class],
-                    ['object_id' => $coach->id],
-                );
-            }
+            // 更新技师服务距离设置
+            $coach->settingValues()->updateOrCreate(
+                [
+                    'item_id' => $distanceItem->id,
+                    'object_type' => $coach::class,
+                    'object_id' => $coach->id,
+                ],
+                ['value' => $distance]
+            );
 
+            // 返回最新设置
             return [
-                'message' => '订单设置更新成功',
-                'coach_id' => $coach->id,
-                'settings' => $data,
+                'distance' => $distance,
+                'distance_max' => (float)$distanceItem->max_value,
+                'distance_min' => (float)$distanceItem->min_value,
             ];
         });
     }