OrderObserver.php 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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->type === 2) {
  18. $user = $order->user;
  19. $user->update([ // 清理全部流量,重置重置日期和等级
  20. 'u' => 0,
  21. 'd' => 0,
  22. 'transfer_enable' => 0,
  23. 'reset_time' => null,
  24. 'level' => 0,
  25. 'enable' => 0,
  26. ]);
  27. Helpers::addUserTrafficModifyLog($user->id, $user->transfer_enable, 0, __('[Service Timer] Service Expiration'), $order->id);
  28. Order::userActivePackage($order->user_id)->update(['is_expire' => 1]); // 过期生效中的加油包
  29. $this->activatePrepaidPlan($order->user_id); // 激活预支付套餐
  30. }
  31. if (Arr::has($changes, 'status')) {
  32. if ($changes['status'] === -1) { // 本地订单-在线订单 关闭互联
  33. if ($order->payment) {
  34. $order->payment->close(); // 关闭在线订单
  35. }
  36. if ($order->coupon) { // 退回优惠券
  37. $this->returnCoupon($order, $order->coupon);
  38. }
  39. if ($order->goods && $order->goods->type === 2 && $order->getOriginal('status') === 2 && Order::userPrepay($order->user_id)->exists()) { // 下一个套餐
  40. $this->activatePrepaidPlan($order->user_id);
  41. } else {
  42. (new OrderService($order))->refreshAccountExpiration();
  43. }
  44. } elseif ($changes['status'] === 1) { // 待确认支付 通知管理
  45. Notification::send(User::find(1), new PaymentConfirm($order));
  46. } elseif ($changes['status'] === 2 && $order->getOriginal('status') !== 3) { // 本地订单-在线订单 支付成功互联
  47. (new OrderService($order))->receivedPayment();
  48. } elseif ($changes['status'] === 3) {
  49. if (Order::userActivePlan($order->user_id)->doesntExist()) {
  50. $this->activatePrepaidPlan($order->user_id);
  51. } else {
  52. (new OrderService($order))->refreshAccountExpiration();
  53. }
  54. }
  55. }
  56. }
  57. private function activatePrepaidPlan(int $user_id): void
  58. { // 激活[预支付订单]
  59. $prepaidOrder = Order::userPrepay($user_id)->first(); // 检查该订单对应用户是否有预支付套餐
  60. if ($prepaidOrder) {
  61. (new OrderService($prepaidOrder))->activatePrepaidPlan(); // 激活预支付套餐
  62. }
  63. }
  64. private function returnCoupon(Order $order, Coupon $coupon): void
  65. { // 退回优惠券
  66. if ($coupon->type !== 3 && ! $coupon->isExpired()) {
  67. Helpers::addCouponLog('订单取消, 自动退回', $order->coupon_id, $order->goods_id, $order->id);
  68. $coupon->update(['usable_times' => $coupon->usable_times + 1, 'status' => 0]);
  69. }
  70. }
  71. }