Отображение продаваемого количества в интерфейсе Magento 2.3


В настоящее время мы показываем наше доступное количество на складе на интерфейсе каждого продукта, используя следующий код:

<?php 
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
    $qty = $StockState->getStockQty($_product->getId());
?>

Но когда мы включаем новую функцию MSI в Magento 2, приведенный выше код всегда выводит 0. Как мы можем показать общее количество продаваемых товаров во внешнем интерфейсе всех источников инвентаризации?

Редактировать:

Я обнаружил, что когда я включаю источник по умолчанию, назначаю его продукту и даю ему, например, 10 шт. Приведенный выше код выводит 10, поэтому приведенный выше код не учитывает все источники запасов. Он должен показывать общее количество продаваемых товаров, как показано в бэкэнде.

Редактировать 2:

Объяснение с изображениями.

Default source enabled

С указанными выше настройками приведенный выше код выводит 10. Он должен вывести 25.

Default source disabled

Когда источник по умолчанию не назначен, приведенный выше код выводит 0. Он должен вывести 15.

Author: Rk Rathod, 2019-03-26

5 answers

Определение продаваемого количества включает в себя минимальное количество.

В настоящее время MSI - это подход. Таким образом, никаких других методов, ярлыков, средств управления объектами или кода ретроспективной памяти M1. Все это должно быть подходом MSI, который будет совместим с будущими версиями M2.

Итак, давайте перейдем к делу:

    $websiteCode = $this->storeManager->getWebsite()->getCode();
    $stock = $this->stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode);
    $stockId = $stock->getStockId();

Здесь вы получите свой идентификатор акции для вашего веб-сайта. Это может быть всегда одно и то же, но вы должны посмотреть его.

Если на интерфейсе вы хотите показать другое сообщение для товар в резервном заказе, то вы можете сделать это:

        $stockItem = $this->getStockItemConfiguration->execute($product->getSku(), $stockId);
        $minQty = $stockItem->getMinQty();

        $salableQty = $this->productSalableQty->execute($product->getSku(), $stockId);

Чтобы определить, есть ли товар на складе и в продаже:

        $product->isSalable()

Если вы хотите показать, что такое низкий запас, вы можете получить это от:

    $lowStock = $this->scopeConfig->getValue(self::XML_PATH_STOCK_THRESHOLD_QTY, ScopeInterface::SCOPE_STORE);

Объединение этих значений для отображения наличия на складе:

        if (($salableQty + $minQty) > $lowStock) {

Это показывает, что легко доступно без ожидания отложенных заказов и без низких запасов.

Если вы хотите знать, что есть на складе, включая низкие запасы, измените вышеуказанное на:

        if (($salableQty + $minQty) > 0) {

Для настройки вашего класс использует интерфейсы:

use Magento\InventoryConfigurationApi\Api\GetStockItemConfigurationInterface;
use Magento\InventorySalesApi\Api\GetProductSalableQtyInterface;
use Magento\InventorySalesApi\Api\StockResolverInterface;
use Magento\Store\Model\StoreManagerInterface;

Затем для вашего конструктора:

const XML_PATH_STOCK_THRESHOLD_QTY = 'cataloginventory/options/stock_threshold_qty';

private $getStockItemConfiguration;
private $productSalableQty;
private $stockResolver;
private $storeManager;

public function __construct(
    . . .
    GetProductSalableQtyInterface $productSalableQty,
    GetStockItemConfigurationInterface $getStockItemConfiguration,
    StockResolverInterface $stockResolver,
    StoreManagerInterface $storeManager,
    . . .
) {
    $this->getStockItemConfiguration = $getStockItemConfiguration;
    $this->productSalableQty = $productSalableQty;
    $this->stockResolver = $stockResolver;
    $this->storeManager = $storeManager;
    . . .
}
 7
Author: Mavis Bacon, 2020-02-14 09:15:30

Попробуйте это. Полное решение, основанное на других ответах

use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;

$productSalable = $objectManager->get('\Magento\InventorySalesApi\Api\GetProductSalableQtyInterface');
$stockResolver = $objectManager->get('\Magento\InventorySalesApi\Api\StockResolverInterface');

$stockId    = $stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $website_code)->getStockId();
$stockQty   = $productSalable->execute($product_sku, $stockId);

$website_code = код веб-сайта из всего магазина. $product_sku = артикул продукта. Результатом ($STOCKQTY) будет количество продукта определенного запаса, а не значение запаса по умолчанию

 4
Author: bryanxkier, 2020-02-06 04:34:41

Я нашел свое собственное решение в следующем фрагменте кода:

<?php 
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $StockState = $objectManager->get('\Magento\InventorySalesApi\Api\GetProductSalableQtyInterface');
    $qty = $StockState->execute($_product->getSku(), 2);
?>

Я надеюсь, что это может помочь другим!:)

2 = $StockID

 3
Author: JudgeB, 2019-03-26 17:35:15

Все интерфейсы Cataloginventory, включая интерфейс StockStateИнтерфейс, устарели с версии Magento 2.3.1 Вы можете видеть, что в исходном коде Magento они также будут выделены как устаревшие, если вы используете PHP IDE для разработки. https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/CatalogInventory/Api/StockStateInterface.php#L13-L15

Начиная с Magento 2.3 правильный способ получения товарного количества следующий:

         /** @var \Magento\InventorySalesApi\Api\StockResolverInterface */
        $stockId = $this->stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode)->getStockId();
        /** @var \Magento\InventorySalesApi\Api\GetProductSalableQtyInterface */
        $qty = (int)$this->getProductSalableQty->execute($sku, $stockId);
 1
Author: Igor Minyaylo, 2019-04-11 16:37:00

Попробуйте это

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$StockState = $objectManager->get('\Magento\InventorySalesAdminUi\Model\GetSalableQuantityDataBySku');
$qty = $StockState->execute($_product->getSku());
print_r($qty)

Результат должен быть

Array ( [0] => Array ( [stock_name] => other [qty] => 980 [manage_stock] => 1 ) ) 
 0
Author: ratheepan siva, 2019-07-12 09:47:33