Magento 2: Как программно обновить статус заказа в пользовательском модуле?

11
$orderId = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$order = $objectManager->create('\Magento\Sales\Model\Order')->load($orderId); 
$order->setState("processing")->setStatus("processing");
$order->save();

Подскажите пожалуйста, как мне обновить статус заказа в Magento 2?

Рахул Каточ
источник

Ответы:

19

Вы можете сделать это следующим образом

объявить ниже пространство имен

use Magento\Sales\Model\Order;

$orderId = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$order = $objectManager->create('\Magento\Sales\Model\Order') ->load($orderId);
$orderState = Order::STATE_PROCESSING;
$order->setState($orderState)->setStatus(Order::STATE_PROCESSING);
$order->save();

Надеюсь это поможет

Давал Соланки
источник
спасибо за ответ @Dhaval Drcsystems Я хочу только обновить статус заказа
Rahul Katoch
Вы можете обратиться к этой модели, чтобы получить лучшее представление. Magento \ Sales \ Model \ Order \ Payment Проверьте, как они обрабатывают заказ с помощью кода.
Давал Соланки
приведенный выше код показывает \ Magento \ Sales \ Model \ Order not found error
Jaisa
Можете ли вы показать мне свой файл?
Давал Соланки
Как обновить статус пользовательского заказа? Если у меня есть статус под названием 'sent_to_print'?
Джафар Пинджар
12

Обновление состояния заказа

Чтобы обновить состояние заказа и статус программы программно, определите статус и состояние в этом формате. Инициируйте объект заказа в функции конструкции и используйте этот объект заказа в пользовательской функции для его обновления. Чтобы программно обновить состояние заказа в модели, получите объект заказа из функции конструкции.

public function __construct(
    \Magento\Sales\Model\Order $order
){
    $this->order = $order;
}
public function updateorder(){
    $order = $this->order;
    $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING, true);
    $order->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING);
    $order->addStatusToHistory($order->getStatus(), 'Order processed successfully with reference');
    $order->save();
}

Новый заказ по электронной почте

$orderid = '10000000';
$order = $this->_objectManager->get('Magento\Sales\Model\Order')->loadByIncrementId($orderid);
$this->_objectManager->get('Magento\Sales\Model\Order\Email\Sender\OrderSender')->send($order);
gelanivishal
источник
большое спасибо за ответ @calypso, но я хочу обновить только статус заказа
Rahul Katoch
@Rahulocodewire Это также в комментарии.
Геланивишал
@ calypso, пожалуйста, объясни, где я поместил этот код в свой модуль
Рахул Каточ
как показать состояние ожидания в контроллере?
Рахул Каточ
5

Поскольку load () и save () устарели (потому что :)

* @deprecated 100.1.0 because entities must not be responsible for their own loading.
* Service contracts should persist entities. Use resource model "load" or collections to implement
* service contract model loading operations.

Я использовал OrderRepositoryInterface, чтобы загрузить и сохранить заказ:

use Magento\Sales\Api\OrderRepositoryInterface;

public function __construct(
    OrderRepositoryInterface $orderRepository,
    ...
) {
    $this->orderRepository = $orderRepository;
}

...
$order = $this->orderRepository->get($orderId);
$order->setState(\Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW);
$order->setStatus(\Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW);

try {
    $this->orderRepository->save($order);
} catch (\Exception $e) {
    $this->logger->error($e);
    $this->messageManager->addExceptionMessage($e, $e->getMessage());
}

Надеюсь, поможет

medmek
источник
как обновить статус пользовательского заказа?
Джафар Пинджар
3

Спасибо @medmek и @ prince-patel. В ответ на вопрос @ jafar-pinjar относительно статуса пользовательского заказа вызовы setState и setStatus могут принимать код состояния. Например, создается пользовательский код статуса «платный». Чтобы обновить статус / состояние заказа:

...
use \Magento\Sales\Api\OrderRepositoryInterface;

class nameOfTheClass {
    ...
    protected $_orderRepository;
    ...
    public function __construct(..., OrderRepositoryInterface $orderRepository, ...){

        $this->_orderRepository = $orderRepository;
        ...
    }
    ...
    public function setOrderStatus($orderID, $statusCode){
        try{
            // obtain the order with the order ID
            $order = $this->_orderRepository->get($orderID);
            $order->setState($statusCode)->setStatus($statusCode);
            $this->_orderRepository->save($order);
            return true;
        } catch (\Exception $e){
            // add some logging here
            return false;
        }
    }
    ...
}

Чтобы обновить статус заказа:

$orderID = 1234; // this is the order ID
$code = 'paid';
$this->setOrderStatus($orderID, $code);

Надеюсь, это поможет кому-то там.

qgor
источник
1
инкрементный идентификатор подобен # 3000001469-1, а не 1234. 1234 - это скорее идентификатор заказа
Greck
Спасибо, что указали на это @Greck. Обновил ответ.
qgor
2

Magento 2.2.2 Это работает только следующим образом!

    $order = $this->order->loadByIncrementId('000000001');
    //$order = $this->order;
    $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING, true)->save();
    $order->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING, true)->save();
    $order->addStatusToHistory($order->getStatus(), 'Order processed successfully with reference again and again');
    //$order->save();

Но единственная проблема, которая у меня есть, заключается в том, что она не обновляет полностью статус: введите описание изображения здесь

Это только обновляет в сетке и следующее: введите описание изображения здесь

Также невозможно создать новый счет, накладную и кредитовое авизо. Спасибо

Джулиано Варгас
источник