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?

Відповіді:


20

Зробити це можна наступним чином

оголосити нижче простору імен

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 Я хочу лише оновити статус замовлення
Рахул Каточ

Ви можете віднести цю модель, щоб ви отримали кращу ідею Magento \ Продажі \ Модель \ Замовлення \ Оплата Перевірте тут, як вони обробляють замовлення з кодом.
Дхаваль Соланкі

наведений вище код показує \ Magento \ Продажі \ Модель \ Помилка не знайдена
Jaisa

Ви можете, будь ласка, показати мені свій файл?
Дхаваль Соланкі

Як оновити статус замовлення? Якщо у мене є статус "sent_to_print"?
jafar pinjar

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);

велике спасибі за відповідь @calypso, але я хочу оновити лише статус замовлення
Рахул Каточ

@Rahulocodewire Це також у коментарі.
gelanivishal

@ 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());
}

Сподіваюся, це допомагає


як оновити статус замовлення?
jafar pinjar

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);

Сподіваюся, що хтось там допоможе.


1
інкрементний ідентифікатор як # 3000001469-1, що не 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();

Але єдина проблема, яка у мене є, це те, що він не оновлює повністю статус: введіть тут опис зображення

Він лише оновлює в мережі та наступне: введіть тут опис зображення

Також неможливо створити новий рахунок-фактуру, доставку та кредитну пам'ятку. Дякую

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.