all(); $config = Config::get(); $appointment = AppointmentConfig::where(function ($query) use ($all) { if (isset($all['appointment_type_id'])) { $query->where('appointment_type_id', $all['appointment_type_id']); } })->where('show_front', 1)->get(); // 场地类型 $appointment_type = AppointmentType::get(); return $this->success(compact('config', 'appointment', 'appointment_type')); } /** * @OA\Get( * path="/api/mobile/other/banner", * tags={"小程序-其他"}, * summary="获取banner", * @OA\Parameter(name="position", in="query", @OA\Schema(type="integer"), required=true, description="位置1首页"), * @OA\Response( * response=200, * description="操作成功" * ) * ) */ public function banner() { $position = request('position', 1); $config = Banner::with('image')->where(function ($query) use ($position) { if (isset($position)) { $query->where('position', $position); } })->orderBy('sort')->get(); return $this->success($config); } /** * @OA\Get( * path="/api/mobile/other/company", * tags={"小程序-其他"}, * summary="公司搜索", * @OA\Parameter(name="company_name", in="query", @OA\Schema(type="integer"), required=true, description="公司名字"), * @OA\Response( * response=200, * description="操作成功" * ) * ) */ public function company() { $all = \request()->all(); $messages = [ 'company_name.required' => '公司名称必填', ]; $validator = Validator::make($all, [ 'company_name' => 'required', ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $YuanheRepository = new YuanheRepository(); // $result = $YuanheRepository->search(['keyword' => $all['company_name']]); $result = "[{\"createBy\":null,\"createDt\":null,\"updateBy\":null,\"updateDt\":null,\"creditCode\":\"91320594MA7F0G9W6A\",\"keyNo\":\"db5ppy5kbsprbbhjbjlarvmvphjhp3mrkv\",\"name\":\"苏州元瞰科技有限公司\",\"operName\":\"刘杰杰\",\"startDate\":\"2021-12-21\",\"status\":\"注销\"},{\"createBy\":null,\"createDt\":null,\"updateBy\":null,\"updateDt\":null,\"creditCode\":\"91310118MA1JMYNK9K\",\"keyNo\":\"ak95iy5s3rhmsasj5kepiijjimh95jl3b5\",\"name\":\"上海元橡瞰行科技有限公司\",\"operName\":\"任杰\",\"startDate\":\"2019-03-19\",\"status\":\"存续\"},{\"createBy\":null,\"createDt\":null,\"updateBy\":null,\"updateDt\":null,\"creditCode\":\"91110108MAERYU4T74\",\"keyNo\":\"fs3ijyphhk59kbhjblbsj35priklbla5vh\",\"name\":\"北京元字瞰科技有限公司\",\"operName\":\"宋明龙\",\"startDate\":\"2025-08-22\",\"status\":\"存续\"},{\"createBy\":null,\"createDt\":null,\"updateBy\":null,\"updateDt\":null,\"creditCode\":\"\",\"keyNo\":\"13ivbylse5l5mjkjar9pbhkm9vpsjiksjl\",\"name\":\"上海瞰元信息科技有限公司\",\"operName\":\"刘勇\",\"startDate\":\"2005-06-30\",\"status\":\"吊销\"},{\"createBy\":null,\"createDt\":null,\"updateBy\":null,\"updateDt\":null,\"creditCode\":\"91330100796660273A\",\"keyNo\":\"f3aaeyiss99ev5hjbipkv9eaerkih99bbs\",\"name\":\"杭州瞰元信息科技有限公司\",\"operName\":\"曾铁农\",\"startDate\":\"2006-12-22\",\"status\":\"吊销\"}]\""; $result = json_decode($result, true); if (!$result) { return $this->fail([ResponseCode::ERROR_PARAMETER, '获取失败']); } return $this->success($result); } /** * @OA\Get( * path="/api/mobile/other/company-list", * tags={"小程序-其他"}, * summary="公司列表", * @OA\Parameter(name="company_name", in="query", @OA\Schema(type="string"), required=false, description="公司名字"), * @OA\Parameter(name="company_longitude", in="query", @OA\Schema(type="string"), required=false, description="经度"), * @OA\Parameter(name="company_latitude", in="query", @OA\Schema(type="string"), required=false, description="纬度"), * @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"), * @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"), * @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), * @OA\Response( * response=200, * description="操作成功" * ) * ) */ public function companyList() { $all = \request()->all(); $messages = [ 'company_longitude.required' => '经度必填', 'company_latitude.required' => '纬度必填', ]; $validator = Validator::make($all, [ 'company_longitude' => 'required', 'company_latitude' => 'required', ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $longitude = floatval($all['company_longitude']); $latitude = floatval($all['company_latitude']); $pageSize = intval($all['page_size'] ?? 10); $page = intval($all['page'] ?? 1); $sortName = $all['sort_name'] ?? 'distance'; $sortType = $all['sort_type'] ?? 'asc'; // 使用简单稳定的距离计算公式 $distanceFormula = " (6371 * acos( GREATEST(-1, LEAST(1, cos(radians(?)) * cos(radians(CAST(company_latitude AS DECIMAL(10,8)))) * cos(radians(CAST(company_longitude AS DECIMAL(10,8))) - radians(?)) + sin(radians(?)) * sin(radians(CAST(company_latitude AS DECIMAL(10,8)))) )) )) AS distance "; $query = Company::with([ 'users' => function ($query) { $query->with([ 'courseSigns' => function ($query) { $query->with('course')->orderBy('fee_status', 'desc'); } ]); } ]) ->whereHas('users', function ($query) { $query->where('is_schoolmate', 1); }) ->select('*') ->selectRaw($distanceFormula, [$latitude, $longitude, $latitude]) ->where(function ($query) use ($all) { if (isset($all['company_name'])) { $query->where('company_name', 'like', '%' . $all['company_name'] . '%'); } }) ->whereNotNull('company_longitude') ->whereNotNull('company_latitude') ->where('company_longitude', '!=', '') ->where('company_latitude', '!=', '') ->whereRaw('company_longitude REGEXP \'^-?[0-9]+\.?[0-9]*$\'') ->whereRaw('company_latitude REGEXP \'^-?[0-9]+\.?[0-9]*$\'') ->whereRaw('CAST(company_longitude AS DECIMAL(10,8)) BETWEEN -180 AND 180') ->whereRaw('CAST(company_latitude AS DECIMAL(10,8)) BETWEEN -90 AND 90'); // 根据排序字段进行排序 if ($sortName === 'distance') { // 距离排序始终按升序(从近到远) $query->orderBy('distance', 'asc'); } else { $query->orderBy($sortName, $sortType); } $result = $query->paginate($pageSize, ['*'], 'page', $page); return $this->success($result); } }