UserService.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. /**
  3. * @Name
  4. * @Description
  5. * @Author 刘学玺
  6. * @Date 2024/9/10 16:07
  7. */
  8. namespace App\Http\Services\Frontend\Client\Coach;
  9. use App\Enums\Common\Status;
  10. use App\Exceptions\ApiException;
  11. use App\Http\Services\Service;
  12. use App\Models\Coach\Site;
  13. use App\Models\Coach\User;
  14. use App\Models\Service\Project;
  15. use Illuminate\Support\Facades\Auth;
  16. use Illuminate\Support\Facades\DB;
  17. class UserService extends Service
  18. {
  19. protected $select_column = ['id', 'name', 'avatar', 'sex', 'brief', 'total_order_num as totalOrderNum'];
  20. protected $show_column = ['license', 'work_img as workImg', 'self_img as selfImg'];
  21. public function getUserPage($params): array
  22. {
  23. $category_id = $params['categoryId'] ?? 1;
  24. $sort = $params['sort'] ?? 'order';
  25. // 给定的中心点坐标
  26. $latitude = $params['lat'] ?? 0;
  27. $longitude = $params['lng'] ?? 0;
  28. // 城市区域
  29. $cityCode = $params['cityCode'];
  30. // 距离
  31. $distance = $params['params'] ?? 10;
  32. // 获取项目分类包含
  33. $project_ids = DB::table('service_project_has_category')->where('category_id', $category_id)->pluck('project_id');
  34. // 获取项目
  35. $project_ids = Project::query()->whereIn('id', $project_ids)->where('status', Status::ENABLE)->pluck('id');
  36. // 获取开通项目技师
  37. $coach_ids = DB::table('service_project_has_coach')->whereIn('project_id', $project_ids)->pluck('coach_id');
  38. // 获取定位区域技师
  39. $coach_ids = Site::query()->where('city_code', $cityCode)->pluck('coach_id');
  40. $userWhere = ['status' => 1, 'auth_status' => 2];
  41. $coachQuery = User::query()->whereIn('id', $coach_ids)->where($userWhere);
  42. // 获取技师距离
  43. $coachQuery->withWhereHas('site', function ($query) use ($latitude, $longitude, $sort, $distance) {
  44. $r = 6370.996; // 地球半径
  45. // 距离,单位为公里或英里,这里以公里为单位
  46. $distanceRaw = "($r * acos(cos(radians($latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($longitude)) + sin(radians($latitude)) * sin(radians(latitude))))";
  47. $query->selectRaw("coach_id,round($distanceRaw,1) as distance");
  48. $sort === 'distance' && $query->having('distance', '<=', $distance);
  49. });
  50. // 订单排序
  51. $sort === 'order' && $coachQuery->orderByDesc('total_order_num');
  52. $coachQuery->select($this->select_column);
  53. $userPage = $coachQuery->paginate();
  54. return ['list' => $userPage->items(), 'total' => $userPage->total()];
  55. }
  56. public function getUser(array $params, int $id)
  57. {
  58. $category_id = $params['categoryId'] ?? 0;
  59. $latitude = $params['lat'];
  60. $longitude = $params['lng'];
  61. $coachQuery = User::query()->select([...$this->select_column, ...$this->show_column]);
  62. // 获取技师距离
  63. $coachQuery->withWhereHas('site', function ($query) use ($latitude, $longitude) {
  64. $r = 6370.996; // 地球半径
  65. // 距离,单位为公里或英里,这里以公里为单位
  66. $distanceRaw = "($r * acos(cos(radians($latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($longitude)) + sin(radians($latitude)) * sin(radians(latitude))))";
  67. $query->selectRaw("coach_id,round($distanceRaw,1) as distance");
  68. });
  69. $user = $coachQuery->find($id);
  70. $category_id && ($user['project'] = $user->getProject($category_id));
  71. return $user;
  72. }
  73. /**
  74. * Notes :
  75. * Method : 申请技师
  76. * @param array $params
  77. * @param int $user_id
  78. * @throws ApiException
  79. */
  80. public function apply(array $params)
  81. {
  82. $user_id = Auth::id();
  83. // 判断技师资格是否已申请
  84. $isExists = User::query()->where('user_id', $user_id)->exists();
  85. if ($isExists) self::error('用户已经申请');
  86. $params['user_id'] = $user_id;
  87. // 判断邀请人$input['partner_id']
  88. $user = self::toModel($params, User::class);
  89. return User::query()->create($user->getAttributes())->id;
  90. }
  91. }