BikeStatusInfoSyncHandler.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/10/8
  6. * Time: 3:41 PM
  7. */
  8. namespace App\Handlers;
  9. use App\Models\Bike;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Redis;
  12. class BikeStatusInfoSyncHandler
  13. {
  14. //用户
  15. const ROLE_USER = 'user';
  16. //运维人员
  17. const ROLE_WORKER = 'worker';
  18. //系统本身
  19. const ROLE_SERVER = 'server';
  20. //绑定人员
  21. const ROLE_BIND = 'bind';
  22. private static $redis = '';
  23. //还车时过期时间
  24. const CLOSE_BIKE_TTL = 5;
  25. //正常未骑行车的缓存标识
  26. const REDIS_BIKE_LOCATION_TAG = 'bike_locations';
  27. const REDIS_RIDE_BIKE_ORDERS_TAG = 'ride_orders:';
  28. public function __construct()
  29. {
  30. self::$redis = Redis::connection();
  31. }
  32. /**
  33. * 车辆处于骑行状态 (用户订单时(data: 订单id[id],区域id[area_id],车辆id[bike_id]))
  34. * @param $bike_no
  35. * @param array $data
  36. * User: Mead
  37. */
  38. public function toBikeRideStatus($role, $bike_no, $data = [], $merchant_id = false)
  39. {
  40. $data['role'] = $role;
  41. //临时锁车状态
  42. $data['is_temporary_close'] = 0;
  43. //是否超出运营区域
  44. $data['is_out_area_lost_electric'] = 1;
  45. //是否低电关电车
  46. $data['is_low_electric_close_bike'] = 1;
  47. self::$redis->set(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no, serialize($data));
  48. if (!$merchant_id) {
  49. $merchant_id = Bike::byBikeNoGetMerchantId($bike_no);
  50. }
  51. $bike_key = self::REDIS_BIKE_LOCATION_TAG . ":{$merchant_id}";
  52. //删除未骑行状态
  53. self::$redis->zrem($bike_key, $bike_no);
  54. }
  55. /**
  56. * 车辆处于等待骑行状态
  57. * @param $bike_no
  58. * User: Mead
  59. */
  60. public function toBikeWaitRideStatus($bike_no, $lng = 0, $lat = 0, $merchant_id = false)
  61. {
  62. // self::$redis->hdel(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no);
  63. self::$redis->expire(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no, self::CLOSE_BIKE_TTL);
  64. if (!$merchant_id) {
  65. $merchant_id = Bike::byBikeNoGetMerchantId($bike_no);
  66. }
  67. $bike_key = self::REDIS_BIKE_LOCATION_TAG . ":{$merchant_id}";
  68. self::$redis->geoadd($bike_key, $lng, $lat, $bike_no);
  69. }
  70. /**
  71. * 改变车为订单为临时停车
  72. * @param $bike_no
  73. * User: Mead
  74. */
  75. public function toBikeTemporaryWaitRideStatus($bike_no)
  76. {
  77. $data = $this->getRideBikeOrderInfo($bike_no);
  78. $data['is_temporary_close'] = 1;
  79. self::$redis->set(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no, serialize($data));
  80. }
  81. /**
  82. * 改变车为订单为临时停车
  83. * @param $bike_no
  84. * User: Mead
  85. */
  86. public function toBikeTemporaryRideStatus($bike_no)
  87. {
  88. $data = $this->getRideBikeOrderInfo($bike_no);
  89. $data['is_temporary_close'] = 0;
  90. self::$redis->set(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no, serialize($data));
  91. }
  92. /**
  93. * 改变车为订单为开车(租车)
  94. * @param $bike_no
  95. * User: Mead
  96. */
  97. public function toBikeRentRideStatus($bike_no)
  98. {
  99. $data = $this->getRideBikeOrderInfo($bike_no);
  100. if (!$data) {
  101. $order = DB::table('rent_orders')->where('bike_no', $bike_no)->orderByDesc('id')->first();
  102. $data = [
  103. 'id' => $order->id,
  104. 'bike_id' => $order->bike_id,
  105. 'area_id' => $order->area_id,
  106. 'is_rent' => 1,
  107. 'role' => 'user'
  108. ];
  109. //是否超出运营区域
  110. $data['is_out_area_lost_electric'] = 1;
  111. //是否低电关电车
  112. $data['is_low_electric_close_bike'] = 1;
  113. }
  114. $data['is_close_bike'] = 0;
  115. self::$redis->set(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no, serialize($data));
  116. }
  117. /**
  118. *
  119. * @param $bike_no
  120. * @return mixed
  121. * Author: Mead
  122. */
  123. public function getBikeIfOutAreaLoseElectric($bike_no)
  124. {
  125. $data = $this->getRideBikeOrderInfo($bike_no);
  126. $b = isset($data['is_out_area_lost_electric']) ? $data['is_out_area_lost_electric'] : 1;
  127. return !$b;
  128. }
  129. /**
  130. * 改变车为订单为停车(租车)
  131. * @param $bike_no
  132. * User: Mead
  133. */
  134. public function toBikeRentWaitRideStatus($bike_no)
  135. {
  136. $data = $this->getRideBikeOrderInfo($bike_no);
  137. if (!$data) {
  138. $order = DB::table('rent_orders')->where('bike_no', $bike_no)->orderByDesc('id')->first();
  139. $data = [
  140. 'id' => $order->id,
  141. 'bike_id' => $order->bike_id,
  142. 'area_id' => $order->area_id,
  143. 'is_rent' => 1,
  144. 'role' => 'user'
  145. ];
  146. //是否超出运营区域
  147. $data['is_out_area_lost_electric'] = 1;
  148. //是否低电关电车
  149. $data['is_low_electric_close_bike'] = 1;
  150. }
  151. $data['is_close_bike'] = 1;
  152. self::$redis->set(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no, serialize($data));
  153. }
  154. /**
  155. * 车辆上线
  156. * @param $bike_no
  157. * @param int $lat
  158. * @param int $lng
  159. * User: Mead
  160. */
  161. public function toBikeOnLineStatus($bike_no, $lng = 0, $lat = 0, $merchant_id = false)
  162. {
  163. // self::$redis->hdel(self::REDIS_RIDE_BIKE_ORDERS_TAG, $bike_no);
  164. self::$redis->del([self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no]);
  165. if (!$merchant_id) {
  166. $merchant_id = Bike::byBikeNoGetMerchantId($bike_no);
  167. }
  168. $bike_key = self::REDIS_BIKE_LOCATION_TAG . ":{$merchant_id}";
  169. self::$redis->geoadd($bike_key, $lng, $lat, $bike_no);
  170. }
  171. /**
  172. * 车辆离线
  173. * @param $bike_no
  174. * User: Mead
  175. */
  176. public function toBikeOffLineStatus($bike_no, $merchant_id = false)
  177. {
  178. if (!$merchant_id) {
  179. $merchant_id = Bike::byBikeNoGetMerchantId($bike_no);
  180. }
  181. $bike_key = self::REDIS_BIKE_LOCATION_TAG . ":{$merchant_id}";
  182. //删除未骑行状态
  183. self::$redis->zrem($bike_key, $bike_no);
  184. }
  185. /**
  186. * 获取订单信息
  187. * @param $bike_no
  188. * @return mixed
  189. * User: Mead
  190. */
  191. public function getRideBikeOrderInfo($bike_no)
  192. {
  193. $order = self::$redis->get(self::REDIS_RIDE_BIKE_ORDERS_TAG . $bike_no);
  194. if (!$order) return false;
  195. return unserialize($order);
  196. }
  197. }