Отмените заказы, которые старше 3 дней


Я пытаюсь выполнить задание cron после того, как клиент нажмет кнопку разместить заказ и перенаправит на страницу успеха. Таким образом, цель моей работы, если администратор не ответил на заказ в течение 3 дней, статус заказа будет автоматически отменен.

Я переопределил \Magento\Checkout\Контроллер\Onepage\Успех в своем модуле и использую функцию execute для запуска моей работы через терминал.

<?php namespace Mymodule\Checkout\Controller\Onepage;

class Success extends \Magento\Checkout\Controller\Onepage\Success
{
    /**
     * Order success action
     *
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {
        exec('php bin/magento cron:run --group="custom"');
        return parent::execute();
    }
}

Вот crontab.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="custom_group">
        <job name="test_cronjob" instance="Mymodule\Checkout\Cron\CancelOrder" method="execute">
            <schedule>* * */3 * *</schedule>
        </job>
    </group>
</config>

Вот CancelOrder.php

<?php namespace Mymodule\Checkout\Cron;

class CancelOrder {
    protected $orderFactory;

    protected $checkoutSession;

    public function __construct(
        \Magento\Sales\Model\OrderFactory $orderFactory,
        \Magento\Checkout\Model\Session $checkoutSession
    ){
        $this->orderFactory = $orderFactory;
        $this->checkoutSession = $checkoutSession;
    }

    public function execute() {
        $orderId = $this->checkoutSession->getLastOrderId();
        if (!empty($orderId)) {
            $order = $this->orderFactory->create();
            $order->load($orderId);

            if ($order->getStatus() == 'pending') {
                $order->setState('canceled');
                $order->setStatus('canceled');

                $order->save();

                // send email to customer
            } else {
                return 0;
            }
        }
    }
}

Когда я пытаюсь разместить заказ, задание не выполняется. Что-то не так с моим кодом?

Author: Seventh St, 2017-02-27

2 answers

Насколько я понимаю, вы хотите отменить заказы старше 3 дней. В этом случае нам нужно создать задание Cron. Итак, мы сравним текущую дату с датой создания (посмотрите таблицу sales_order, найдите столбец created_at).

Мы должны использовать Уровень Сервисных контрактов:

  • \Magento\Sales\Api\OrderRepositoryInterface $orderRepository и \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder используются для получения элементов заказа.

  • \Magento\Sales\Api\OrderManagementInterface используется для отмены заказа.

Наш Крон:

namespace Mymodule\Checkout\Cron;

class CancelOrder
{
    /**
     * @var \Magento\Sales\Api\OrderRepositoryInterface
     */
    protected $orderRepository;
    /**
     * @var \Magento\Framework\Api\SearchCriteriaBuilder
     */
    protected $searchCriteriaBuilder;

    /**
     * @var \Magento\Sales\Api\OrderManagementInterface
     */
    protected $orderManagement;

    /**
     * CancelOrder constructor.
     * @param \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
     * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
     * @param \Magento\Sales\Api\OrderManagementInterface $orderManagement
     */
    public function __construct(
        \Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
        \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
        \Magento\Sales\Api\OrderManagementInterface $orderManagement
    )
    {
        $this->orderRepository = $orderRepository;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        $this->orderManagement = $orderManagement;
    }

    public function execute()
    {
        $agoDate = '2016-11-07'; // For example date, your logic to calculate the date here
        $searchCriteria = $this->searchCriteriaBuilder
        ->addFilter(
            'created_at',
            $agoDate,
            'gt'
        )->addFilter(
           'status'
           'pending'
           'eq'
        )->create();

        $orders = $this->orderRepository->getList($searchCriteria);
        foreach ($orders->getItems() as $order) {
                $this->orderManagement->cancel($order->getEntityId()); // Cancel Order
        };

    }
}

Вы должны настроить запуск Cron каждую минуту: https://crontab.guru/

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="custom_group">
        <job name="test_cronjob" instance="Mymodule\Checkout\Cron\CancelOrder" method="execute">
            <schedule>* * * * *</schedule>
        </job>
    </group>
</config>

ПРИМЕЧАНИЕ: Вы можете проверить свой пользовательский Cron напрямую: https://magento.stackexchange.com/a/152812/33057

 7
Author: Khoa TruongDinh, 2017-04-13 12:54:58

Создайте свое собственное задание cron, которое автоматически отменит заказы старше 3 дней, отфильтрованные по статусу заказа.

 0
Author: Jonathan Ribas, 2017-02-27 12:04:16