value) ->leftJoin('coach_project', function ($join) use ($coach) { $join->on('project.id', '=', 'coach_project.project_id') ->where('coach_project.coach_id', '=', $coach->id) ->where('coach_project.state', '=', ProjectStatus::OPEN->value); }) ->select([ 'project.id', 'project.title', 'project.subtitle', 'project.cover', 'project.price', 'project.original_price', 'project.sales', 'project.duration', 'project.project_desc', 'project.service_desc', 'project.type', DB::raw('CASE WHEN coach_project.id IS NOT NULL THEN true ELSE false END as is_opened'), DB::raw('CASE WHEN coach_project.id IS NOT NULL THEN "已开通" ELSE "未开通" END as opened_text'), ]) ->get() ->toArray(); } /** * 技师开通/关闭项目 * * 业务流程: * 1. 验证技师状态 * 2. 验证项目状态 * 3. 根据操作类型处理项目 * 4. 返回操作结果 * * @param CoachUser $coach 技师对象 * @param array $data 项目操作数据,包含: * - project_id: int 项目ID * - action: string 操作类型(open:开通 close:关闭) * @return array 操作结果,包含: * - project_id: int 项目ID * - project_name: string 项目名称 * - state: int 项目状态 * - state_text: string 状态描述 * @throws \Illuminate\Http\Exceptions\HttpResponseException 当验证失败时抛出异常 */ public function openProject(CoachUser $coach, array $data): array { return DB::transaction(function () use ($coach, $data) { // 检查技师状态是否正常 $coach->validateActiveStatus('技师状态异常,无法操作项目'); // 验证项目是否存在且状态为开放 $project = Project::validateOpenProject($data['project_id']); // 根据操作类型处理项目并获取状态 $state = match ($data['action']) { 'open' => $this->handleProjectOpen($coach, $data['project_id']), 'close' => $this->handleProjectClose($coach, $data['project_id']), }; // 返回格式化的操作结果 return $project->formatActionResult($state); }); } /** * 处理项目开通 * * @param CoachUser $coach 技师对象 * @param int $projectId 项目ID * @return int 返回开通后的状态值 */ private function handleProjectOpen(CoachUser $coach, int $projectId): int { // 创建或更新项目关联为开通状态 $coach->updateOrCreateProjectRelation($projectId, ProjectStatus::OPEN->value); return ProjectStatus::OPEN->value; } /** * 处理项目关闭 * * @param CoachUser $coach 技师对象 * @param int $projectId 项目ID * @return int 返回关闭后的状态值 */ private function handleProjectClose(CoachUser $coach, int $projectId): int { // 创建或更新项目关联为关闭状态 $coach->updateOrCreateProjectRelation($projectId, ProjectStatus::CLOSE->value); return ProjectStatus::CLOSE->value; } /** * 设置项目参数 * * 业务流程: * 1. 验证项目开通状态 * 2. 更新项目设置 * 3. 返回更新结果 * * @param CoachUser $coach 技师对象 * @param array $data 项目设置数据,包含: * - project_id: int 项目ID * - voucher: ?float 代金券金额(0-10元) * - gender: ?int 顾客性别设置(0:不限 1:男 2:女) * - traffic_fee_type: ?int 交通费设置(0:免费 1:单程 2:双程) * @return array 更新结果,包含: * - message: string 更新结果消息 * - coach_id: int 技师ID * - settings: array 更新后的设置值 * @throws \Illuminate\Http\Exceptions\HttpResponseException 当项目未开通时抛出异常 */ public function setProject(CoachUser $coach, array $data): array { return DB::transaction(function () use ($coach, $data) { // 获取并验证已开通的项目 $coachProject = $this->getValidatedCoachProject($coach, $data['project_id']); // 更新项目设置 $coachProject->update($this->prepareProjectSettings($data, $coachProject)); // 返回更新结果 return $this->formatProjectSettings($coach->id, $coachProject); }); } /** * 获取并验证已开通的项目 * * @param CoachUser $coach 技师对象 * @param int $projectId 项目ID * @return \App\Models\CoachProject * @throws \Illuminate\Http\Exceptions\HttpResponseException */ private function getValidatedCoachProject(CoachUser $coach, int $projectId) { $coachProject = $coach->projects() ->where('project_id', $projectId) ->first(); abort_if(!$coachProject, 404, '未开通该项目'); return $coachProject; } /** * 准备项目设置数据 * * @param array $data 请求数据 * @param \App\Models\CoachProject $coachProject 当前项目设置 * @return array 更新数据 */ private function prepareProjectSettings(array $data, $coachProject): array { return [ 'discount_amount' => $data['voucher'] ?? $coachProject->discount_amount, 'service_gender' => $data['gender'] ?? $coachProject->service_gender, 'traffic_fee_type' => $data['traffic_fee_type'] ?? $coachProject->traffic_fee_type, ]; } /** * 格式化项目设置结果 * * @param int $coachId 技师ID * @param \App\Models\CoachProject $coachProject 项目设置 * @return array 格式化后的结果 */ private function formatProjectSettings(int $coachId, $coachProject): array { return [ 'message' => '项目设置更新成功', 'coach_id' => $coachId, 'settings' => [ 'voucher' => $coachProject->discount_amount, 'gender' => $coachProject->service_gender, 'traffic_fee_type' => $coachProject->traffic_fee_type, ], ]; } /** * 获取项目参数设置 * * 业务流程: * 1. 验证项目开通状态 * 2. 获取项目设置 * 3. 返回格式化结果 * * @param CoachUser $coach 技师对象 * @param int $projectId 项目ID * @return array 项目设置,包含: * - project_id: int 项目ID * - project_name: string 项目名称 * - settings: array 设置值 * - voucher: string 代金券金额 * - gender: int 顾客性别设置 * - traffic_fee_type: int 交通费类型 * @throws \Illuminate\Http\Exceptions\HttpResponseException 当项目未开通时抛出异常 */ public function getProjectSettings(CoachUser $coach, int $projectId): array { // 获取并验证已开通的项目 $coachProject = $this->getValidatedCoachProject($coach, $projectId); // 获取项目基本信息 $project = Project::findOrFail($projectId); // 返回格式化的设置 return [ 'project_id' => $projectId, 'project_name' => $project->title, 'settings' => [ 'voucher' => $coachProject->discount_amount, 'gender' => $coachProject->service_gender, 'traffic_fee_type' => $coachProject->traffic_fee_type, ] ]; } }