DepositRefundJob.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\DepositOrder;
  4. use App\Models\RefundLog;
  5. use App\Models\User;
  6. use App\Repositories\OrderRepository;
  7. use App\Repositories\PunishmentOrderRepository;
  8. use App\Repositories\RentOrderRepository;
  9. use App\Repositories\UserRepository;
  10. use Carbon\Carbon;
  11. use Illuminate\Database\Eloquent\Model;
  12. class DepositRefundJob extends Job
  13. {
  14. protected $model = '';
  15. public $tries = 5;
  16. /**
  17. * Create a new job instance.
  18. *
  19. * @return void
  20. */
  21. public function __construct(Model $model, Carbon $delay)
  22. {
  23. $this->model = $model;
  24. // 设置延迟的时间,delay() 方法的参数代表多少秒之后执行
  25. $this->delay($delay);
  26. }
  27. /**
  28. * @return bool
  29. * Author: Mead
  30. */
  31. public function handle(OrderRepository $orderRepository, RentOrderRepository $rentOrderRepository, PunishmentOrderRepository $punishmentOrderRepository, UserRepository $userRepository)
  32. {
  33. //判断用户当前退款是否在等待中
  34. if ((int)$this->model->pay_status !== RefundLog::PAY_STATUS_WAIT) {
  35. return true;
  36. }
  37. $user_id = $this->model->user_id;
  38. if (!$userRepository->byIdCheckStatusOk($user_id)) {
  39. RefundLog::where('id', $this->model->id)->update([
  40. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  41. 'result' => '用户状态异常'
  42. ]);
  43. return true;
  44. }
  45. if ($orderRepository->byUserIdCheckIsExistNoPayOrder($user_id)) {
  46. RefundLog::where('id', $this->model->id)->update([
  47. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  48. 'result' => '有未完成的用车订单'
  49. ]);
  50. return true;
  51. }
  52. if ($rentOrderRepository->byUserIdCheckIsExistRideOrder($user_id)) {
  53. RefundLog::where('id', $this->model->id)->update([
  54. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  55. 'result' => '有未完成的租车订单'
  56. ]);
  57. return true;
  58. }
  59. if ($rentOrderRepository->byUserIdCheckIsExistNoPayOrder($user_id)) {
  60. RefundLog::where('id', $this->model->id)->update([
  61. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  62. 'result' => '有未支付的租车订单'
  63. ]);
  64. return true;
  65. }
  66. $punish = $punishmentOrderRepository->checkNoPayModel($user_id);
  67. if (!$punish) {
  68. RefundLog::where('id', $this->model->id)->update([
  69. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  70. 'result' => '有未支付的罚单'
  71. ]);
  72. return true;
  73. }
  74. $order = DepositOrder::where('id', $this->model->deposit_id)->first();
  75. $payment = app('wechat.payment'); // 微信支付
  76. $result = $payment->refund->byOutTradeNumber($order->no, $this->model->no, wechat_fee($order->pay_money), wechat_fee($this->model->pay_money), [
  77. // 可在此处传入其他参数,详细参数见微信支付文档
  78. 'refund_desc' => '用户申请退回押金',
  79. 'notify_url' => config('app.url') . '/api/payments/wechat-refund-notify',
  80. ]);
  81. $user = User::where('id', $user_id)->first();
  82. if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') {
  83. // 判断是否有免押金卡
  84. $deposit_expire_time = Carbon::parse($user->deposit_expire_time);
  85. if (Carbon::now()->gte($deposit_expire_time)) {
  86. // 免押金卡已经过期
  87. User::where('id', $user->id)->update([
  88. 'deposit_money' => 0,
  89. 'is_deposit' => User::DEPOSIT_NO,
  90. 'deposit_type' => User::DEPOSIT_TYPE_NO
  91. ]);
  92. } else {
  93. // 免押金卡未过期
  94. User::where('id', $user->id)->update([
  95. 'deposit_money' => 0,
  96. 'is_deposit' => User::DEPOSIT_OK,
  97. 'deposit_type' => User::DEPOSIT_CARD
  98. ]);
  99. }
  100. }
  101. return true;
  102. }
  103. }