OrderCancel.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace app\job;
  3. use app\common\model\Order;
  4. use app\common\Service\OrderService;
  5. use app\common\Enum\OrderEnum;
  6. use think\queue\Job;
  7. use think\Log;
  8. /**
  9. * 订单自动取消队列任务
  10. * 用于处理未支付订单的自动取消
  11. */
  12. class OrderCancel
  13. {
  14. /**
  15. * 执行队列任务
  16. * @param Job $job 当前任务对象
  17. * @param array $data 任务数据
  18. */
  19. public function fire(Job $job, $data)
  20. {
  21. try {
  22. $orderId = $data['order_id'] ?? 0;
  23. $orderSn = $data['order_sn'] ?? '';
  24. if (empty($orderId) || empty($orderSn)) {
  25. Log::error('OrderCancel job: 缺少必要参数', $data);
  26. $job->delete();
  27. return;
  28. }
  29. // 获取订单信息
  30. $order = Order::get($orderId);
  31. if (!$order) {
  32. Log::info("OrderCancel job: 订单不存在,订单号: {$orderSn}");
  33. $job->delete();
  34. return;
  35. }
  36. // 检查订单状态,只有待支付状态的订单才能自动取消
  37. if ($order->order_status != OrderEnum::STATUS_CREATE) {
  38. Log::info("OrderCancel job: 订单状态已变更,无需取消,订单号: {$orderSn}, 当前状态: {$order->order_status}");
  39. $job->delete();
  40. return;
  41. }
  42. // 检查订单是否已过期
  43. if ($order->expire_time && $order->expire_time > time()) {
  44. Log::info("OrderCancel job: 订单未过期,无需取消,订单号: {$orderSn}");
  45. $job->delete();
  46. return;
  47. }
  48. // 执行订单取消逻辑
  49. $result = OrderService::cancelOrder($orderId, '系统自动取消(超时未支付)');
  50. if ($result) {
  51. Log::info("OrderCancel job: 订单自动取消成功,订单号: {$orderSn}");
  52. } else {
  53. Log::error("OrderCancel job: 订单自动取消失败,订单号: {$orderSn}");
  54. }
  55. // 删除任务
  56. $job->delete();
  57. } catch (\Exception $e) {
  58. Log::error('OrderCancel job 执行异常: ' . $e->getMessage(), [
  59. 'data' => $data,
  60. 'trace' => $e->getTraceAsString()
  61. ]);
  62. // 如果任务执行失败次数超过3次,删除任务
  63. if ($job->attempts() > 3) {
  64. Log::error("OrderCancel job: 任务执行失败次数过多,删除任务,订单号: " . ($data['order_sn'] ?? 'unknown'));
  65. $job->delete();
  66. } else {
  67. // 重新放回队列,延迟60秒后重试
  68. $job->release(60);
  69. }
  70. }
  71. }
  72. /**
  73. * 任务失败处理
  74. * @param array $data 任务数据
  75. */
  76. public function failed($data)
  77. {
  78. Log::error('OrderCancel job 最终失败', $data);
  79. }
  80. }