ParkingController.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/8/19
  6. * Time: 2:23 PM
  7. */
  8. namespace App\Http\Controllers\V1;
  9. use App\Handlers\ConvertHandler;
  10. use App\Http\Requests\AreaIdRequest;
  11. use App\Http\Requests\NearBySiteRequest;
  12. use App\Models\AreaSetting;
  13. use App\Models\Parking;
  14. use App\Repositories\AreaSettingRepository;
  15. use App\Repositories\ParkingRepository;
  16. use App\Transformers\ParkingTransformer;
  17. use Illuminate\Support\Facades\Redis;
  18. /**
  19. * 停车点模块
  20. * Class ParkingController
  21. * @package App\Http\Controllers\V1
  22. */
  23. class ParkingController extends BaseController
  24. {
  25. /**
  26. * 有区域id 获取区域停车点
  27. * @param AreaIdRequest $request
  28. * @param ParkingRepository $parkingRepository
  29. * @return \Dingo\Api\Http\Response
  30. * User: Mead
  31. */
  32. public function stopSite(AreaIdRequest $request, ParkingRepository $parkingRepository, AreaSettingRepository $areaSettingRepository)
  33. {
  34. try {
  35. $area_id = $request->get('area_id', false);
  36. if ($areaSettingRepository->byAreaIdGetIsWholeAreaHuanche($area_id) === AreaSetting::WHOLE_AREA_HUANCHE_NO) {
  37. $parking = $parkingRepository->byAreaIdGetAllStopSites($area_id);
  38. } else {
  39. $parking = $parkingRepository->byAreaIdGetBanStopSites($area_id);
  40. }
  41. return $this->response->collection($parking, ParkingTransformer::class);
  42. } catch (\Exception $exception) {
  43. return $this->errorNoValidation($exception->getMessage());
  44. }
  45. }
  46. /**
  47. * 有区域id 获取区域禁停区
  48. * @param AreaIdRequest $request
  49. * @param ParkingRepository $parkingRepository
  50. * @return \Dingo\Api\Http\Response
  51. * User: Mead
  52. */
  53. public function banStopSite(AreaIdRequest $request, ParkingRepository $parkingRepository)
  54. {
  55. try {
  56. $area_id = $request->get('area_id', false);
  57. $parking = $parkingRepository->byAreaIdGetBanStopSites($area_id);
  58. return $this->response->collection($parking, ParkingTransformer::class);
  59. } catch (\Exception $exception) {
  60. return $this->errorNoValidation($exception->getMessage());
  61. }
  62. }
  63. /**
  64. * 获取附近停车区
  65. * @param NearBySiteRequest $request
  66. * @param Parking $parking
  67. * User: Mead
  68. */
  69. public function nearbySite(NearBySiteRequest $request, Parking $parking, AreaSettingRepository $areaSettingRepository)
  70. {
  71. try {
  72. $lng = $request->get('lng');
  73. $lat = $request->get('lat');
  74. $location_lat = $request->get('location_lat');
  75. $location_lng = $request->get('location_lng');
  76. $area_id = $request->get('area_id');
  77. if ($areaSettingRepository->byAreaIdGetIsWholeAreaHuanche($area_id) === AreaSetting::WHOLE_AREA_HUANCHE_OK) {
  78. return $this->errorNoValidation('该运营区域内都可以停车(除禁停区内)!');
  79. }
  80. $options = ['SORT' => 'ASC', 'WITHDIST' => true, 'WITHCOORD' => true];
  81. $redis = Redis::connection();
  82. $stop_bike_stations = $redis->georadius(Parking::REDIS_STOP_BIKE_SITE_TAG . "_{$area_id}", $lng, $lat, 1, 'km', $options);
  83. $ids = array_column($stop_bike_stations, 0);
  84. $stop_bike_names = $parking->whereIn('id', $ids)->get(['id', 'name', 'description', 'parking_centre as centre', 'parking_fence as fence', 'parking_radius as radius', 'type'])->mapWithKeys(function ($item) {
  85. $item['centre'] = js2php($item['centre']);
  86. $item['fence'] = js2php($item['fence']);
  87. return [$item['id'] => $item];
  88. })->toArray();
  89. $return_stop_bikes = [];
  90. foreach ($stop_bike_stations as $bike_station) {
  91. $item = $stop_bike_names[$bike_station[0]];
  92. $item['location_distance'] = format_mileage(bcdiv((new ConvertHandler())->distance($location_lat, $location_lng, $bike_station[2][1], $bike_station[2][0]), 1000, 2));
  93. $item['distance'] = format_mileage($bike_station[1]);
  94. $return_stop_bikes[] = $item;
  95. }
  96. return $this->response->array($return_stop_bikes);
  97. } catch (\Exception $exception) {
  98. return $this->errorException($exception->getMessage());
  99. }
  100. }
  101. }