123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <?php
- /**
- * @Name
- * @Description
- * @Author 刘学玺
- * @Date 2024/9/10 16:07
- */
- namespace App\Http\Services\Frontend\Client\Coach;
- use App\Enums\Common\Status;
- use App\Exceptions\ApiException;
- use App\Http\Services\Service;
- use App\Models\Coach\Site;
- use App\Models\Coach\User;
- use App\Models\Service\Project;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Facades\DB;
- class UserService extends Service
- {
- protected $select_column = ['id', 'name', 'avatar', 'sex', 'brief', 'total_order_num as totalOrderNum'];
- protected $show_column = ['license', 'work_img as workImg', 'self_img as selfImg'];
- public function getUserPage($params): array
- {
- $category_id = $params['categoryId'] ?? 1;
- $sort = $params['sort'] ?? 'order';
- // 给定的中心点坐标
- $latitude = $params['lat'] ?? 0;
- $longitude = $params['lng'] ?? 0;
- // 城市区域
- $cityCode = $params['cityCode'];
- // 距离
- $distance = $params['params'] ?? 10;
- // 获取项目分类包含
- $project_ids = DB::table('service_project_has_category')->where('category_id', $category_id)->pluck('project_id');
- // 获取项目
- $project_ids = Project::query()->whereIn('id', $project_ids)->where('status', Status::ENABLE)->pluck('id');
- // 获取开通项目技师
- $coach_ids = DB::table('service_project_has_coach')->whereIn('project_id', $project_ids)->pluck('coach_id');
- // 获取定位区域技师
- $coach_ids = Site::query()->where('city_code', $cityCode)->pluck('coach_id');
- $userWhere = ['status' => 1, 'auth_status' => 2];
- $coachQuery = User::query()->whereIn('id', $coach_ids)->where($userWhere);
- // 获取技师距离
- $coachQuery->withWhereHas('site', function ($query) use ($latitude, $longitude, $sort, $distance) {
- $r = 6370.996; // 地球半径
- // 距离,单位为公里或英里,这里以公里为单位
- $distanceRaw = "($r * acos(cos(radians($latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($longitude)) + sin(radians($latitude)) * sin(radians(latitude))))";
- $query->selectRaw("coach_id,round($distanceRaw,1) as distance");
- $sort === 'distance' && $query->having('distance', '<=', $distance);
- });
- // 订单排序
- $sort === 'order' && $coachQuery->orderByDesc('total_order_num');
- $coachQuery->select($this->select_column);
- $userPage = $coachQuery->paginate();
- return ['list' => $userPage->items(), 'total' => $userPage->total()];
- }
- public function getUser(array $params, int $id)
- {
- $category_id = $params['categoryId'] ?? 0;
- $latitude = $params['lat'];
- $longitude = $params['lng'];
- $coachQuery = User::query()->select([...$this->select_column, ...$this->show_column]);
- // 获取技师距离
- $coachQuery->withWhereHas('site', function ($query) use ($latitude, $longitude) {
- $r = 6370.996; // 地球半径
- // 距离,单位为公里或英里,这里以公里为单位
- $distanceRaw = "($r * acos(cos(radians($latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($longitude)) + sin(radians($latitude)) * sin(radians(latitude))))";
- $query->selectRaw("coach_id,round($distanceRaw,1) as distance");
- });
- $user = $coachQuery->find($id);
- $category_id && ($user['project'] = $user->getProject($category_id));
- return $user;
- }
- /**
- * Notes :
- * Method : 申请技师
- * @param array $params
- * @param int $user_id
- * @throws ApiException
- */
- public function apply(array $params)
- {
- $user_id = Auth::id();
- // 判断技师资格是否已申请
- $isExists = User::query()->where('user_id', $user_id)->exists();
- if ($isExists) self::error('用户已经申请');
- $params['user_id'] = $user_id;
- // 判断邀请人$input['partner_id']
- $user = self::toModel($params, User::class);
- return User::query()->create($user->getAttributes())->id;
- }
- }
|