소스 검색

feat:技师端-设置项目

刘学玺 4 달 전
부모
커밋
f9e7d2cf25
3개의 변경된 파일98개의 추가작업 그리고 71개의 파일을 삭제
  1. 28 19
      app/Http/Controllers/Coach/ProjectController.php
  2. 69 51
      app/Services/Coach/ProjectService.php
  3. 1 1
      routes/api.php

+ 28 - 19
app/Http/Controllers/Coach/ProjectController.php

@@ -78,33 +78,42 @@ class ProjectController extends Controller
     }
 
     /**
-     * [项目]获取已开通项目列表
+     * [项目]设置项目参数
      *
-     * @description 获取技师已开通的项目列表
+     * @description 设置技师已开通项目的相关参数
      *
      * @authenticated
      *
+     * @bodyParam project_id integer required 项目ID Example: 1
+     * @bodyParam discount_amount numeric 优惠金额(0-10元) Example: 5.00
+     * @bodyParam service_gender integer 服务性别(0:不限 1:男 2:女) Example: 0
+     * @bodyParam service_distance integer 服务距离(公里,0表示不限) Example: 5
+     * @bodyParam traffic_fee_type integer 交通费类型(0:免费 1:单程 2:双程) Example: 2
+     * @bodyParam traffic_fee numeric 交通费金额 Example: 10.00
+     *
      * @response {
-     *   "data": {
-     *     "items": [
-     *       {
-     *         "id": 1,
-     *         "name": "精油推拿",
-     *         "cover": "http://example.com/cover.jpg",
-     *         "price": "188.00",
-     *         "duration": 60,
-     *         "discount_amount": "10.00",
-     *         "traffic_fee": "20.00",
-     *         "is_round_trip": true,
-     *         "opened_at": "2024-03-21 10:00:00"
-     *       }
-     *     ],
-     *     "total": 5
+     *   "message": "项目设置更新成功",
+     *   "project_id": 1,
+     *   "settings": {
+     *     "discount_amount": "5.00",
+     *     "service_gender": 0,
+     *     "service_distance": 5,
+     *     "traffic_fee_type": 2,
+     *     "traffic_fee": "10.00"
      *   }
      * }
      */
-    public function getOpenedProjects()
+    public function setProject(Request $request)
     {
-        return $this->success($this->service->getOpenedProjects(Auth::user()->id));
+        $data = $request->validate([
+            'project_id' => 'required|integer|exists:project,id',
+            'discount_amount' => 'nullable|numeric|min:0|max:10',
+            'service_gender' => 'nullable|integer|in:0,1,2',
+            'service_distance' => 'nullable|integer|min:0',
+            'traffic_fee_type' => 'nullable|integer|in:0,1,2',
+            'traffic_fee' => 'nullable|numeric|min:0',
+        ]);
+
+        return $this->success($this->service->setProject(Auth::user()->id, $data));
     }
 }

+ 69 - 51
app/Services/Coach/ProjectService.php

@@ -3,6 +3,7 @@
 namespace App\Services\Coach;
 
 use App\Enums\ProjectStatus;
+use App\Enums\TechnicianStatus;
 use App\Models\MemberUser;
 use App\Models\Project;
 use Illuminate\Support\Facades\DB;
@@ -11,7 +12,7 @@ use Illuminate\Support\Facades\Log;
 class ProjectService
 {
     /**
-     * 获取可开通的项目列表
+     * 获取所有开通的项目列表
      *
      * @param  int  $userId  技师用户ID
      */
@@ -88,22 +89,21 @@ class ProjectService
                     ->first();
                 abort_if($existingProject, 422, '已开通该项目');
 
+                // 检查技师状态
+                abort_if($user->coach->state !== TechnicianStatus::ACTIVE->value,
+                    422, '技师状态异常,无法开通项目');
+
                 // 创建技师项目关联
                 $coachProject = $user->coach->projects()->create([
-                    // 项目ID
                     'project_id' => $data['project_id'],
-                    // 项目状态
                     'state' => ProjectStatus::OPEN->value,
-                    // 优惠金额
                     'discount_amount' => 0.00,
-                    // 服务性别(0:不限 1:男 2:女)
                     'service_gender' => 0,
-                    // 服务距离(公里 0:不限)
                     'service_distance' => 0,
-                    // 收取路费(0:免费 1:单程 2:双程)
                     'traffic_fee_type' => 2,
-                    // 路费金额
                     'traffic_fee' => 0,
+                    'created_at' => now(),
+                    'updated_at' => now(),
                 ]);
 
                 // 记录日志
@@ -134,56 +134,74 @@ class ProjectService
     }
 
     /**
-     * 获取技师已开通的项目列表
+     * 设置项目
      *
      * @param  int  $userId  技师用户ID
+     * @param  array  $data  项目设置数据
+     * @return array
+     *
+     * @throws \Exception
      */
-    public function getOpenedProjects(int $userId): array
+    public function setProject(int $userId, array $data)
     {
-        try {
-            // 加载用户和技师信息
-            $user = MemberUser::with(['coach'])->findOrFail($userId);
-            abort_if(! $user->coach, 404, '技师信息不存在');
+        return DB::transaction(function () use ($userId, $data) {
+            try {
+                // 加载用户和技师信息
+                $user = MemberUser::with(['coach', 'coach.projects'])->findOrFail($userId);
+                abort_if(! $user->coach, 404, '技师信息不存在');
 
-            // 获取已开通的项目
-            $projects = $user->coach->projects()
-                ->with('project')
-                ->where('state', ProjectStatus::ACTIVE->value)
-                ->get()
-                ->map(function ($coachProject) {
-                    return [
-                        'id' => $coachProject->project->id,
-                        'name' => $coachProject->project->name,
-                        'cover' => $coachProject->project->cover,
-                        'price' => $coachProject->project->price,
-                        'duration' => $coachProject->project->duration,
-                        'discount_amount' => $coachProject->discount_amount,
-                        'traffic_fee' => $coachProject->traffic_fee,
-                        'is_round_trip' => $coachProject->is_round_trip,
-                        'opened_at' => $coachProject->created_at,
-                    ];
-                });
+                // 检查项目是否存在
+                $coachProject = $user->coach->projects()
+                    ->where('project_id', $data['project_id'])
+                    ->first();
+                abort_if(! $coachProject, 404, '未开通该项目');
+
+                // TODO:取值范围待定(从配置表中获取)
+
+                // 验证服务距离的合理范围
+                if (isset($data['service_distance']) && $data['service_distance'] > 0) {
+                    abort_if($data['service_distance'] > 50, 422, '服务距离不能超过50公里');
+                }
+
+                // 更新项目设置
+                $coachProject->update([
+                    'discount_amount' => $data['discount_amount'] ?? $coachProject->discount_amount,
+                    'service_gender' => $data['service_gender'] ?? $coachProject->service_gender,
+                    'service_distance' => $data['service_distance'] ?? $coachProject->service_distance,
+                    'traffic_fee_type' => $data['traffic_fee_type'] ?? $coachProject->traffic_fee_type,
+                    'traffic_fee' => $data['traffic_fee'] ?? $coachProject->traffic_fee,
+                ]);
 
-            // 记录日志
-            Log::info('获取已开通项目列表成功', [
-                'user_id' => $userId,
-                'coach_id' => $user->coach->id,
-                'project_count' => $projects->count(),
-            ]);
+                // 记录日志
+                Log::info('技师项目设置更新成功', [
+                    'user_id' => $userId,
+                    'coach_id' => $user->coach->id,
+                    'project_id' => $data['project_id'],
+                    'settings' => $data,
+                ]);
 
-            return [
-                'items' => $projects,
-                'total' => $projects->count(),
-            ];
+                return [
+                    'message' => '项目设置更新成功',
+                    'project_id' => $coachProject->project_id,
+                    'settings' => [
+                        'discount_amount' => $coachProject->discount_amount,
+                        'service_gender' => $coachProject->service_gender,
+                        'service_distance' => $coachProject->service_distance,
+                        'traffic_fee_type' => $coachProject->traffic_fee_type,
+                        'traffic_fee' => $coachProject->traffic_fee,
+                    ],
+                ];
 
-        } catch (\Exception $e) {
-            Log::error('获取已开通项目列表失败', [
-                'user_id' => $userId,
-                'error' => $e->getMessage(),
-                'file' => $e->getFile(),
-                'line' => $e->getLine(),
-            ]);
-            throw $e;
-        }
+            } catch (\Exception $e) {
+                Log::error('技师项目设置更新失败', [
+                    'user_id' => $userId,
+                    'data' => $data,
+                    'error' => $e->getMessage(),
+                    'file' => $e->getFile(),
+                    'line' => $e->getLine(),
+                ]);
+                throw $e;
+            }
+        });
     }
 }

+ 1 - 1
routes/api.php

@@ -157,6 +157,6 @@ Route::middleware(['auth:sanctum', 'verified'])->prefix('coach')->group(function
     Route::prefix('projects')->group(function () {
         Route::get('/available', [CoachProjectController::class, 'getAvailableProjects']);
         Route::post('/open', [CoachProjectController::class, 'openProject']);
-        Route::get('/opened', [CoachProjectController::class, 'getOpenedProjects']);
+        Route::post('/set', [CoachProjectController::class, 'setProject']);
     });
 });