123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- <?php
- namespace app\job;
- use app\common\model\Order;
- use app\common\Service\OrderService;
- use app\common\Enum\OrderEnum;
- use think\queue\Job;
- use think\Log;
- /**
- * 订单自动取消队列任务
- * 用于处理未支付订单的自动取消
- */
- class OrderCancel
- {
- /**
- * 执行队列任务
- * @param Job $job 当前任务对象
- * @param array $data 任务数据
- */
- public function fire(Job $job, $data)
- {
- try {
- $orderId = $data['order_id'] ?? 0;
- $orderSn = $data['order_sn'] ?? '';
-
- if (empty($orderId) || empty($orderSn)) {
- Log::error('OrderCancel job: 缺少必要参数', $data);
- $job->delete();
- return;
- }
-
- // 获取订单信息
- $order = Order::get($orderId);
- if (!$order) {
- Log::info("OrderCancel job: 订单不存在,订单号: {$orderSn}");
- $job->delete();
- return;
- }
-
- // 检查订单状态,只有待支付状态的订单才能自动取消
- if ($order->order_status != OrderEnum::STATUS_CREATE) {
- Log::info("OrderCancel job: 订单状态已变更,无需取消,订单号: {$orderSn}, 当前状态: {$order->order_status}");
- $job->delete();
- return;
- }
-
- // 检查订单是否已过期
- if ($order->expire_time && $order->expire_time > time()) {
- Log::info("OrderCancel job: 订单未过期,无需取消,订单号: {$orderSn}");
- $job->delete();
- return;
- }
-
- // 执行订单取消逻辑
- $result = OrderService::cancelOrder($orderId, '系统自动取消(超时未支付)');
-
- if ($result) {
- Log::info("OrderCancel job: 订单自动取消成功,订单号: {$orderSn}");
- } else {
- Log::error("OrderCancel job: 订单自动取消失败,订单号: {$orderSn}");
- }
-
- // 删除任务
- $job->delete();
-
- } catch (\Exception $e) {
- Log::error('OrderCancel job 执行异常: ' . $e->getMessage(), [
- 'data' => $data,
- 'trace' => $e->getTraceAsString()
- ]);
-
- // 如果任务执行失败次数超过3次,删除任务
- if ($job->attempts() > 3) {
- Log::error("OrderCancel job: 任务执行失败次数过多,删除任务,订单号: " . ($data['order_sn'] ?? 'unknown'));
- $job->delete();
- } else {
- // 重新放回队列,延迟60秒后重试
- $job->release(60);
- }
- }
- }
-
- /**
- * 任务失败处理
- * @param array $data 任务数据
- */
- public function failed($data)
- {
- Log::error('OrderCancel job 最终失败', $data);
- }
- }
|