OrderCancelJob.php 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. namespace app\jobs\order;
  3. // 自动取消超时订单
  4. use app\models\Goods;
  5. use app\models\Order;
  6. use app\models\OrderDetail;
  7. use yii\base\BaseObject;
  8. use yii\queue\JobInterface;
  9. class OrderCancelJob extends BaseObject implements JobInterface
  10. {
  11. public $order_id;
  12. public function execute($queue)
  13. {
  14. try {
  15. $order_id = $this->order_id;
  16. $order = Order::findOne($order_id);
  17. if (intval($order->trade_status) === Order::ORDER_FLOW_DEFAULT && intval($order->is_pay) === Order::IS_PAY_FALSE && $order->pay_type !== Order::PAY_TYPE_COD) {
  18. $over_time = time() - (15 * 60);
  19. if ($order->created_at < $over_time) {
  20. $order->trade_status = Order::ORDER_FLOW_CANCEL;
  21. if (!$order->save()) {
  22. throw new \Exception(json_encode($order->errors, JSON_UNESCAPED_UNICODE));
  23. }
  24. // 商城商品总库存恢复
  25. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->asArray()->all();
  26. foreach ($order_detail_list as $order_detail) {
  27. $goods = Goods::findOne($order_detail['goods_id']);
  28. $attr_id_list = [];
  29. foreach (json_decode($order_detail['attr'], true) as $item) {
  30. array_push($attr_id_list, $item['attr_id']);
  31. }
  32. $goods->numAdd($attr_id_list, $order_detail['num']);
  33. }
  34. } else {
  35. \queue_push(new OrderCancelJob(['order_id' => $order_id]), 900);
  36. }
  37. }
  38. } catch (\Exception $e) {
  39. debug_log([
  40. 'msg' => $e->getMessage(),
  41. 'line' => $e->getLine()
  42. ], 'orderCancelJob.log');
  43. }
  44. }
  45. }