OrderObserver.php 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace App\Observers;
  3. use App\Models\Coupon;
  4. use App\Models\Order;
  5. use App\Models\User;
  6. use App\Notifications\PaymentConfirm;
  7. use App\Services\OrderService;
  8. use App\Utils\Helpers;
  9. use Arr;
  10. use Notification;
  11. class OrderObserver
  12. {
  13. public function updated(Order $order): void
  14. {
  15. $changes = $order->getChanges();
  16. // 套餐订单-流量包订单互联:订单过期时直接处理
  17. if (Arr::has($changes, 'is_expire') && $changes['is_expire'] === 1 && $order->goods && $order->goods->type === 2) {
  18. $user = $order->user;
  19. $oldTransferEnable = $user->transfer_enable;
  20. // 过期加油包
  21. Order::userActivePackage($order->user_id)->update(['is_expire' => 1]);
  22. // 检查是否有预支付订单
  23. $prepaidOrder = Order::userPrepay($order->user_id)->first();
  24. if ($prepaidOrder) {
  25. (new OrderService($prepaidOrder))->activatePlan();
  26. } else {
  27. // 无预支付订单:仅清理用户
  28. $user->update([
  29. 'u' => 0,
  30. 'd' => 0,
  31. 'transfer_enable' => 0,
  32. 'reset_time' => null,
  33. 'level' => 0,
  34. 'enable' => 0,
  35. ]);
  36. Helpers::addUserTrafficModifyLog($user->id, $oldTransferEnable, 0, trans('[Service Timer] Service Expiration'), $order->id);
  37. }
  38. }
  39. if (Arr::has($changes, 'status')) {
  40. $originalStatus = $order->getOriginal('status');
  41. switch ($changes['status']) {
  42. case -1: // 订单关闭
  43. if ($order->payment) {
  44. $order->payment->close();
  45. }
  46. if ($order->coupon) {
  47. $this->returnCoupon($order, $order->coupon);
  48. }
  49. if ($order->goods && $order->goods->type === 2 && $originalStatus === 2 && Order::userPrepay($order->user_id)->exists()) {
  50. $prepaidOrder = Order::userPrepay($order->user_id)->first();
  51. (new OrderService($prepaidOrder))->activatePlan();
  52. } else {
  53. (new OrderService($order))->refreshAccountExpiration();
  54. }
  55. break;
  56. case 1: // 待确认支付
  57. Notification::send(User::find(1), new PaymentConfirm($order));
  58. break;
  59. case 2: // 支付成功
  60. if ($originalStatus !== 3) {
  61. (new OrderService($order))->receivedPayment();
  62. }
  63. break;
  64. case 3: // 预支付订单
  65. if (Order::userActivePlan($order->user_id)->doesntExist()) {
  66. $prepaidOrder = Order::userPrepay($order->user_id)->first();
  67. if ($prepaidOrder) {
  68. (new OrderService($prepaidOrder))->activatePlan();
  69. }
  70. } else {
  71. (new OrderService($order))->refreshAccountExpiration();
  72. }
  73. break;
  74. }
  75. }
  76. }
  77. private function returnCoupon(Order $order, Coupon $coupon): void
  78. { // 退回优惠券
  79. if ($coupon->type !== 3 && ! $coupon->isExpired()) {
  80. Helpers::addCouponLog('Order canceled, coupon reinstated.', $order->coupon_id, $order->goods_id, $order->id);
  81. $coupon->update(['usable_times' => $coupon->usable_times + 1, 'status' => 0]);
  82. }
  83. }
  84. }