findAvailableAgent($areaCode); // 获取项目分类 $projectCate = ProjectCate::find($projectCateId); // 获取项目列表 if ($agent) { $agentCate = $agent->cates()->find($projectCate->id); if ($type == 'normal') { $projects = $agentCate->projects()->where('state', 'enable')->whereHas('basicInfo', fn ($q) => $q->where('type', 'normal'))->paginate(10); } else { $projects = $agentCate->projects()->where('state', 'enable')->paginate(10); } } else { if ($type == 'normal') { $projects = $projectCate?->services()->where('type', 'normal')->get(); } else { $projects = $projectCate?->services; } } return $projects; } /** * 如果代理商存在,则返回代理商项目,否则返回系统项目 * * @param int $projectId 项目ID * @param string $areaCode 区域代码 * @return Project 项目模型 * @throws \Illuminate\Http\Exceptions\HttpResponseException 项目不存在时抛出404异常 */ public function getProjectDetail($projectId, $areaCode) { // 查询系统项目 $project = Project::where('state', 'enable')->find($projectId); abort_if(! $project, 404, '项目不存在'); // 根据区域代码获取代理商 $agent = $this->findAvailableAgent($areaCode); if ($agent) { // 查询代理商项目 $project = $agent->projects()->where('project_id', $projectId)->first(); $project->agent_id = $agent->id; } return $project; } /** * 获取技师开通的项目列表 */ public function getCoachProjectList($coachId, $areaCode, $projectCateId) { // 查询技师信息 $coach = CoachUser::where('id', $coachId) ->where('state', 'enable') ->find($coachId); if (! $coach) { throw new \Exception('技师不存在'); } $coachInfo = $coach->info; if (! $coachInfo) { throw new \Exception('技师信息不存在'); } if ($coachInfo->state !== 'approved') { throw new \Exception('技师未通过审核'); } $coachQual = $coach->qual; if (! $coachQual) { throw new \Exception('技师资格证书不存在'); } if ($coachQual->state !== 'approved') { throw new \Exception('技师资格证书未通过审核'); } $coachReal = $coach->real; if (! $coachReal) { throw new \Exception('技师实名认证记录不存在'); } if ($coachReal->state !== 'approved') { throw new \Exception('技师实名认证未通过审核'); } // 获取技师开通的项目ID列表 $projectIds = $coach->projects()->where('state', 'enable')->pluck('project_id'); // 根据区域代码获取代理商 $agent = $this->findAvailableAgent($areaCode); if ($agent) { $agentCate = $agent->cates()->where('project_cate_id', $projectCateId)->first(); $projectIds = $agentCate->projects()->whereIn('project_id', $projectIds)->pluck('project_id'); } return $coach->projects()->with('basicInfo')->whereIn('project_id', $projectIds)->get(); } /** * 递归查找可用的代理商 * * @param string $areaCode 区域代码 * @return Agent|null */ private function findAvailableAgent($areaCode) { // 先查找当前区域的代理商 $agent = AgentInfo::where('area_code', $areaCode) ->where('state', 'enable') ->first(); if ($agent) { return $agent; } // 如果找不到,且区域代码长度大于2,则向上查找 if (strlen($areaCode) > 2) { // 去掉最后两位,获取上级区域代码 $parentAreaCode = substr($areaCode, 0, -2); return $this->findAvailableAgent($parentAreaCode); } return null; } }