Magento 2: Wie aktualisiere ich den Bestellstatus programmgesteuert im benutzerdefinierten Modul?

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

Bitte sagen Sie mir, wie ich den Bestellstatus in Magento 2 aktualisiere.

Rahul Katoch
quelle

Antworten:

18

Sie können es wie folgt tun

Deklarieren Sie unter dem Namespace

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

Hoffe das hilft

Dhaval Solanki
quelle
danke für die Antwort @Dhaval Drcsystems Ich möchte nur den
Bestellstatus
Sie können auf dieses Modell verweisen, um eine bessere Vorstellung von Magento \ Sales \ Model \ Order \ Payment zu erhalten. Überprüfen Sie hier, wie Bestellungen mit Code verarbeitet werden.
Dhaval Solanki
Der obige Code zeigt \ Magento \ Sales \ Model \ Order nicht gefunden Fehler
Jaisa
Können Sie mir bitte Ihre Akte zeigen?
Dhaval Solanki
Wie aktualisiere ich den Status einer benutzerdefinierten Bestellung? Wenn ich den Status 'sent_to_print' habe?
Jafar Pinjar
12

Aktualisierung des Bestellstatus

Um den Auftragsstatus und den Status programmgesteuert zu aktualisieren, definieren Sie den Status und den Status in diesem Format. Initiieren Sie das Bestellobjekt in der Konstruktfunktion und verwenden Sie dieses Bestellobjekt in der benutzerdefinierten Funktion, um es zu aktualisieren. Um den Auftragsstatus programmgesteuert im Modell zu aktualisieren, rufen Sie das Auftragsobjekt aus der Konstruktionsfunktion ab.

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

Neue Bestell-E-Mail

$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
quelle
Vielen Dank für die Antwort @calypso, aber ich möchte nur den Bestellstatus aktualisieren
Rahul Katoch
@ Rahulocodewire Es ist auch in Kommentar.
Gelanivishal
@ Calypso bitte erklären, wo ich diesen Code in mein Modul
eingefügt
Wie zeige ich den Status "Ausstehend" im Controller an?
Rahul Katoch
5

Da load () und save () jetzt veraltet sind (weil :)

* @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.

Ich habe das OrderRepositoryInterface verwendet, um die Bestellung zu laden und zu speichern:

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

Ich hoffe es hilft

medmek
quelle
Wie aktualisiere ich den Status einer benutzerdefinierten Bestellung?
Jafar Pinjar
3

Danke an @medmek und @ prince-patel Antwort. Als Frage von @ jafar-pinjar zum Status der benutzerdefinierten Bestellung können setState- und setStatus-Aufrufe den Statuscode annehmen. Beispielsweise wird der benutzerdefinierte Statuscode "bezahlt" erstellt. So aktualisieren Sie den Status / Status auf eine Bestellung:

...
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;
        }
    }
    ...
}

So aktualisieren Sie den Bestellstatus:

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

Hoffe das hilft jemandem da draußen.

qgor
quelle
1
Inkrementelle ID ist wie # 3000001469-1, nicht 1234. 1234 ist eher Bestell-ID
Greck
Vielen Dank für den Hinweis auf @Greck. Die Antwort wurde aktualisiert.
Qgor
2

Magento 2.2.2 Dies funktioniert nur folgendermaßen!

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

Das einzige Problem, das ich habe, ist, dass der Status nicht vollständig aktualisiert wird: Geben Sie hier die Bildbeschreibung ein

Es werden nur die im Raster und die folgenden aktualisiert: Geben Sie hier die Bildbeschreibung ein

Es ist auch nicht möglich, eine neue Rechnung, einen neuen Versand und eine neue Gutschrift zu erstellen. Vielen Dank

Juliano Vargas
quelle