BikeHandler.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/9/10
  6. * Time: 4:08 PM
  7. */
  8. namespace App\Handlers;
  9. use App\Models\Parking;
  10. use Carbon\Carbon;
  11. use Illuminate\Support\Facades\Cache;
  12. use Illuminate\Support\Facades\Log;
  13. use Illuminate\Support\Facades\Redis;
  14. class BikeHandler
  15. {
  16. /**
  17. * 判断是否在停车点
  18. * @param $lat
  19. * @param $lng
  20. * @param int $area_id
  21. * @return array
  22. * User: Mead
  23. */
  24. public function byLocationCheckIsInStopParking($lat, $lng, $area_id = 0)
  25. {
  26. // 判断是否有还车点
  27. $options = ['SORT' => 'ASC', 'COUNT' => 1, 'WITHDIST' => true];
  28. $redis = Redis::connection();
  29. $stop_bike_stations = $redis->georadius(Parking::REDIS_STOP_BIKE_SITES_TAG . "_{$area_id}", $lng, $lat, 17000, 'm', $options);
  30. if (count($stop_bike_stations) !== 1) {
  31. //没有找到停车点
  32. return [
  33. 'status' => false,
  34. 'distance' => 999999
  35. ];
  36. }
  37. $stop_bike_station = $stop_bike_stations[0];
  38. $distance = $stop_bike_station[1];
  39. $park_id = $stop_bike_station[0];
  40. $stop_bike_station_db = Cache::remember("PARKING_" . $park_id, Carbon::now()->addHours(1), function () use ($park_id) {
  41. return Parking::where('id', $park_id)->first();
  42. });
  43. // 判断是否在还车点内
  44. $ConverHandler = new ConvertHandler();
  45. $is_in_station = $ConverHandler->is_point_in_polygon([
  46. 'latitude' => $lat,
  47. 'longitude' => $lng
  48. ], $stop_bike_station_db->parking_fence);
  49. if ($is_in_station) {
  50. return [
  51. 'status' => true,
  52. 'distance' => $distance
  53. ];
  54. }
  55. // 判断是否在还车点范围内
  56. $is_in_near_station = $ConverHandler->is_point_in_circle([
  57. 'latitude' => $lat,
  58. 'longitude' => $lng
  59. ], ['center' => $stop_bike_station_db->parking_centre, 'radius' => $stop_bike_station_db->parking_radius]);
  60. if ($is_in_near_station) {
  61. return [
  62. 'status' => true,
  63. 'type' => 'circle',
  64. 'distance' => $distance
  65. ];
  66. }
  67. return [
  68. 'status' => false,
  69. 'distance' => $distance
  70. ];
  71. }
  72. /**
  73. * 通过距离获取调度费
  74. * @param $distance
  75. * User: Mead
  76. */
  77. public function byDistanceGetDistanceMoney($distance, $areaSetting)
  78. {
  79. if ($distance <= 3000) {
  80. // $over_money = bcmul(ceil($distance / 500), 5, 2);
  81. // if ($over_money < $areaSetting->min_dispatching_fee) {
  82. // return $over_money;
  83. // }
  84. return $areaSetting->min_dispatching_fee;
  85. }
  86. $over_distance = $distance - 3000;
  87. $over_money = bcadd($areaSetting->min_dispatching_fee, ceil($over_distance / 1000) * 5, 2);
  88. if ($over_money < $areaSetting->max_dispatching_fee) {
  89. return $over_money;
  90. }
  91. return $areaSetting->max_dispatching_fee;
  92. }
  93. }