OrderObserver.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Observers;
  3. use App\Components\Helpers;
  4. use App\Models\Coupon;
  5. use App\Models\Order;
  6. use App\Services\OrderService;
  7. use Arr;
  8. class OrderObserver
  9. {
  10. public function updated(Order $order): void
  11. {
  12. $changes = $order->getChanges();
  13. if (Arr::exists($changes, 'status')) {
  14. // 本地订单-在线订单 关闭互联
  15. if ($changes['status'] === -1) {
  16. $payment = $order->payment;
  17. if ($payment) {
  18. // 关闭在线订单
  19. $payment->update(['status' => -1]);
  20. // 退回优惠券
  21. if ($order->coupon_id && $this->returnCoupon(
  22. $order->coupon
  23. )) {
  24. Helpers::addCouponLog(
  25. '订单超时未支付,自动退回',
  26. $order->coupon_id,
  27. $order->goods_id,
  28. $order->id
  29. );
  30. }
  31. }
  32. }
  33. // 本地订单-在线订单 支付成功互联
  34. if ($changes['status'] === 2 && $order->getOriginal(
  35. 'status'
  36. ) !== 3) {
  37. (new OrderService($order))->receivedPayment();
  38. }
  39. }
  40. // 套餐订单-流量包订单互联
  41. if (Arr::exists($changes, 'is_expire') && $changes['is_expire'] === 1) {
  42. // 过期生效中的加油包
  43. Order::userActivePackage($order->user_id)->update(
  44. ['is_expire' => 1]
  45. );
  46. // 检查该订单对应用户是否有预支付套餐
  47. $prepaidOrder = Order::userPrepay($order->user_id)->oldest()->first(
  48. );
  49. if ($prepaidOrder) {
  50. (new OrderService($prepaidOrder))->activatePrepaidPlan();
  51. }
  52. }
  53. }
  54. // 返回优惠券
  55. private function returnCoupon(Coupon $coupon): bool
  56. {
  57. if ($coupon && $coupon->type !== 3) {
  58. return $coupon->update(
  59. ['usable_times' => $coupon->usable_times + 1, 'status' => 0]
  60. );
  61. }
  62. return false;
  63. }
  64. }