ParkingController.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. $points = [];
  42. $data = [];
  43. foreach ($parking as $model) {
  44. if ($model->type == Parking::TYPE_NO_STOP_BIKE) {
  45. $iconPath = 'http://resource.weilaigo.l4j.cn/ban-stop.png';
  46. $strokeColor = '#FF0000';
  47. $fillColor = '#FF000030';
  48. } else {
  49. $iconPath = 'http://resource.weilaigo.l4j.cn/stop1.png';
  50. $strokeColor = '#FF00FF';
  51. $fillColor = '#FF00FF66';
  52. }
  53. $data[] = [
  54. 'name' => $model->name,
  55. // 'centre' =>
  56. 'points' => $model->parking_fence,
  57. 'radius' => $model->parking_radius,
  58. 'type' => $model->type,
  59. 'type_text' => Parking::$typeMaps[$model->type],
  60. 'strokeWidth' => 4,
  61. 'strokeColor' => $strokeColor,
  62. 'fillColor' => $fillColor
  63. ];
  64. $points[] = array_merge([
  65. 'iconPath' => $iconPath,
  66. 'name' => $model->name,
  67. 'width' => 24,
  68. 'height' => 28,
  69. 'zIndex' => $model->id,
  70. 'id' => $model->id,
  71. 'type' => $model->type,
  72. ], $model->parking_centre);
  73. }
  74. return $this->response->array([
  75. 'centres' => $points,
  76. 'polygons' => $data
  77. ]);
  78. } catch (\Exception $exception) {
  79. return $this->errorNoValidation($exception->getMessage());
  80. }
  81. }
  82. /**
  83. * 有区域id 获取区域禁停区
  84. * @param AreaIdRequest $request
  85. * @param ParkingRepository $parkingRepository
  86. * @return \Dingo\Api\Http\Response
  87. * User: Mead
  88. */
  89. public function banStopSite(AreaIdRequest $request, ParkingRepository $parkingRepository)
  90. {
  91. try {
  92. $area_id = $request->get('area_id', false);
  93. $parking = $parkingRepository->byAreaIdGetBanStopSites($area_id);
  94. $data = [];
  95. $points = [];
  96. foreach ($parking as $model) {
  97. if ($model->type == Parking::TYPE_NO_STOP_BIKE) {
  98. $iconPath = 'http://resource.weilaigo.l4j.cn/ban-stop.png';
  99. $strokeColor = '#FF0000';
  100. $fillColor = '#FF000030';
  101. } else {
  102. $iconPath = 'http://resource.weilaigo.l4j.cn/stop1.png';
  103. $strokeColor = '#FF00FF';
  104. $fillColor = '#FF00FF66';
  105. }
  106. $data[] = [
  107. 'name' => $model->name,
  108. // 'centre' =>
  109. 'points' => $model->parking_fence,
  110. 'radius' => $model->parking_radius,
  111. 'type' => $model->type,
  112. 'type_text' => Parking::$typeMaps[$model->type],
  113. 'strokeWidth' => 4,
  114. 'strokeColor' => $strokeColor,
  115. 'fillColor' => $fillColor
  116. ];
  117. $points[] = array_merge([
  118. 'iconPath' => $iconPath,
  119. 'name' => $model->name,
  120. 'width' => 24,
  121. 'height' => 28,
  122. 'zIndex' => $model->id,
  123. 'id' => $model->id,
  124. 'type' => $model->type,
  125. ], $model->parking_centre);
  126. }
  127. return $this->response->array([
  128. 'centres' => $points,
  129. 'polygons' => $data
  130. ]);
  131. } catch (\Exception $exception) {
  132. return $this->errorNoValidation($exception->getMessage());
  133. }
  134. }
  135. /**
  136. * 获取附近停车区
  137. * @param NearBySiteRequest $request
  138. * @param Parking $parking
  139. * User: Mead
  140. */
  141. public function nearbySite(NearBySiteRequest $request, Parking $parking, AreaSettingRepository $areaSettingRepository)
  142. {
  143. try {
  144. $lng = $request->get('lng');
  145. $lat = $request->get('lat');
  146. $location_lat = $request->get('location_lat');
  147. $location_lng = $request->get('location_lng');
  148. $area_id = $request->get('area_id');
  149. if ($areaSettingRepository->byAreaIdGetIsWholeAreaHuanche($area_id) === AreaSetting::WHOLE_AREA_HUANCHE_OK) {
  150. return $this->errorNoValidation('该运营区域内都可以停车(除禁停区内)!');
  151. }
  152. $options = ['SORT' => 'ASC', 'WITHDIST' => true, 'WITHCOORD' => true];
  153. $redis = Redis::connection();
  154. $stop_bike_stations = $redis->georadius(Parking::REDIS_STOP_BIKE_SITE_TAG . "_{$area_id}", $lng, $lat, 1, 'km', $options);
  155. $ids = array_column($stop_bike_stations, 0);
  156. $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) {
  157. $item['centre'] = js2php($item['centre']);
  158. $item['fence'] = js2php($item['fence']);
  159. return [$item['id'] => $item];
  160. })->toArray();
  161. $points = [];
  162. $polygons = [];
  163. foreach ($stop_bike_stations as $bike_station) {
  164. $item = $stop_bike_names[$bike_station[0]];
  165. $item['location_distance'] = format_mileage(bcdiv((new ConvertHandler())->distance($location_lat, $location_lng, $bike_station[2][1], $bike_station[2][0]), 1000, 2));
  166. $item['distance'] = format_mileage($bike_station[1]);
  167. $iconPath = 'http://resource.weilaigo.l4j.cn/stop1.png';
  168. $strokeColor = '#FF00FF';
  169. $fillColor = '#FF00FF50';
  170. $polygons[] = [
  171. 'points' => $item['fence'],
  172. 'strokeWidth' => 4,
  173. 'strokeColor' => $strokeColor,
  174. 'fillColor' => $fillColor,
  175. 'zIndex' => 1
  176. ];
  177. $points[] = array_merge([
  178. 'iconPath' => $iconPath,
  179. 'width' => 24,
  180. 'height' => 28,
  181. 'zIndex' => 1111,
  182. 'id' => $item['id'],
  183. 'type' => $item['type'],
  184. 'description' => $item['description'],
  185. 'distance' => $item['distance'],
  186. 'location_distance' => $item['location_distance'],
  187. 'name' => $item['name'],
  188. ], $item['centre']);
  189. $points[0]['iconPath'] = 'http://resource.weilaigo.l4j.cn/orange-stop.png';
  190. }
  191. return $this->response->array([
  192. 'points' => $points,
  193. 'polygons' => $polygons
  194. ]);
  195. } catch (\Exception $exception) {
  196. return $this->errorException($exception->getMessage());
  197. }
  198. }
  199. }