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