Отмените заказы, которые старше 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;
}
}
}
}
Когда я пытаюсь разместить заказ, задание не выполняется. Что-то не так с моим кодом?
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
Создайте свое собственное задание cron, которое автоматически отменит заказы старше 3 дней, отфильтрованные по статусу заказа.