Order.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. namespace addons\ddrive\library;
  3. class Order
  4. {
  5. /**
  6. * 根据记录和开始时间计算价格
  7. *
  8. * @param int $distance 记录,单位米
  9. * @param int $time 开始时间/时
  10. * @param [type] $createtime 司机到达时间
  11. * @param [type] $starttime 订单开始时间,会根据司机到达时间计算用户是否超时
  12. * @return void
  13. */
  14. public static function getPrice($distance, $time = null, $createtime = null, $starttime = null)
  15. {
  16. $site = get_addon_config('ddrive');
  17. if ($time == null) {
  18. $time = date('H');
  19. }
  20. // 根据时间计算基础价格使用夜间还是白天
  21. if ($time > $site['excision_time']) {
  22. $base_price = $site['night_base_price'];
  23. } else if ($time < $site['excision_start_time']) {
  24. $base_price = $site['night_base_price'];
  25. } else {
  26. $base_price = $site['base_price'];
  27. }
  28. // $base_price = $time > $site['excision_time'] ? $site['night_base_price'] : $site['base_price'];
  29. // 计算用户是否超时,司机到达后用户是否超过10分种
  30. if ($starttime && $createtime && ($starttime - $createtime) > $site['timeout'] * 60) {
  31. $base_price = $base_price + floor(($starttime - $createtime) / ($site['timeout'] * 60)) * $site['timeout_price'];
  32. }
  33. // 达不到基础距离则使用基础价格
  34. if ($distance <= $site['mileage'] * 1000) {
  35. return $base_price;
  36. }
  37. // 超出基础距离则计算价格
  38. $kilometer_price = ($distance - $site['mileage'] * 1000) / 1000 * $site['kilometer_price'];
  39. return round($base_price + $kilometer_price, 2);
  40. }
  41. /**
  42. * 根据两点间的经纬度计算距离
  43. * @param $lat1
  44. * @param $lng1
  45. * @param $lat2
  46. * @param $lng2
  47. * @return int
  48. */
  49. public static function getDistance($lat1, $lng1, $lat2, $lng2)
  50. {
  51. //将角度转为狐度
  52. $radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
  53. $radLat2 = deg2rad($lat2);
  54. $radLng1 = deg2rad($lng1);
  55. $radLng2 = deg2rad($lng2);
  56. $a = $radLat1 - $radLat2;
  57. $b = $radLng1 - $radLng2;
  58. $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
  59. return $s;
  60. }
  61. }