Magento 2: Jak programowo aktualizować status zamówienia w module niestandardowym?

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

Powiedz mi, jak zaktualizować status zamówienia w Magento 2?

Rahul Katoch
źródło

Odpowiedzi:

20

Możesz to zrobić w następujący sposób

zadeklaruj poniżej przestrzeni nazw

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

Mam nadzieję że to pomoże

Dhaval Solanki
źródło
dzięki za odpowiedź @Dhaval Drcsystems Chcę tylko zaktualizować status zamówienia
Rahul Katoch
Możesz odnieść się do tego modelu, aby uzyskać lepszy pomysł Magento \ Sales \ Model \ Order \ Payment Sprawdź tutaj, w jaki sposób przetwarzają zamówienia z kodem.
Dhaval Solanki
powyższy kod pokazuje \ Magento \ Sales \ Model \ Błąd nie znaleziono zamówienia
Jaisa
Czy możesz mi pokazać swój plik?
Dhaval Solanki
Jak zaktualizować status niestandardowego zamówienia? Jeśli mam status „send_to_print”?
jafar pinjar
12

Zamów aktualizację stanu

Aby zaktualizować stan i status zamówienia pro gramatycznie w celu zdefiniowania statusu i stanu w tym formacie. Zainicjuj obiekt zamówienia w funkcji konstrukcyjnej i użyj tego obiektu zamówienia w funkcji niestandardowej, aby go zaktualizować. Aby programowo zaktualizować stan zamówienia w modelu, pobierz obiekt zamówienia z funkcji konstruowania.

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

E-mail dotyczący nowego zamówienia

$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
źródło
wielkie dzięki za odpowiedź @calypso, ale chcę zaktualizować tylko status zamówienia
Rahul Katoch
@Rahulocodewire To także jest w komentarzu.
gelanivishal
@ calypso proszę wyjaśnić, gdzie umieściłem ten kod w moim module
Rahul Katoch,
jak pokazać status oczekujący w kontrolerze?
Rahul Katoch
5

Ponieważ load () i save () są teraz przestarzałe (ponieważ :)

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

Użyłem interfejsu OrderRepositoryInterface, aby załadować i zapisać zamówienie:

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

Mam nadzieję, że to pomoże

medmek
źródło
jak zaktualizować status niestandardowego zamówienia?
jafar pinjar
3

Dzięki @medmek i @ prince-patel odpowiedzi. Jako pytanie od @ jafar-pinjar dotyczące niestandardowego statusu zamówienia, wywołania setState i setStatus mogą przyjmować kod statusu. Na przykład tworzony jest niestandardowy kod stanu „płatny”. Aby zaktualizować status / stan do zamówienia:

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

Aby zaktualizować status zamówienia:

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

Mam nadzieję, że pomoże komuś tam.

qgor
źródło
1
identyfikator przyrostowy jest jak # 3000001469-1, a nie 1234. 1234 jest raczej identyfikatorem zamówienia
Greck
Dziękujemy za zwrócenie uwagi na @Greck. Zaktualizowano odpowiedź.
qgor
2

Magento 2.2.2 Działa to tylko w następujący sposób!

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

Ale jedynym problemem, jaki mam, jest to, że nie aktualizuje w pełni statusu: wprowadź opis zdjęcia tutaj

Aktualizuje tylko w siatce i następujące czynności: wprowadź opis zdjęcia tutaj

Nie można również utworzyć nowej faktury, wysyłki i noty kredytowej. Dzięki

Juliano Vargas
źródło