Задача загружать заказы в бд. Их может быть как 1 так и 21 и 51 за раз, кол-во разное.
Что сделал:
Получаю информацию о заказах (кол-во разное от 1 до 1000).
Обрабатываю данные, подготавливаю массив.
Далее в цикле, поштучно запускаю функцию создания заказов.
И тут возникает проблема: если заказов до 15-18шт, они создаются без проблем, если кол-во больше то происходит дублирование заказов, причем такое ощущение, что цикл выполняется дважды, один и тот же заказ создается дважды.
Это вывод из функции getPosting. 0-это не дошли до создания заказа, по всяким проверкам. "заказ уже есть в бд" - это была проверка на наличие в бд заказа
А это лог одного из заказов, из которого видно, что форич дважды проходил массив и запускал функцию создания заказа тоже дважды:
Что сделал:
Получаю информацию о заказах (кол-во разное от 1 до 1000).
Обрабатываю данные, подготавливаю массив.
Далее в цикле, поштучно запускаю функцию создания заказов.
И тут возникает проблема: если заказов до 15-18шт, они создаются без проблем, если кол-во больше то происходит дублирование заказов, причем такое ощущение, что цикл выполняется дважды, один и тот же заказ создается дважды.
Код |
---|
public static function getPosting() { //тут получаем данные о заказах, подготавливаем $orders $ids = array(); foreach ($orders as $ord) { $co = Orderlib::createOrder($ord); $ids[] = $co; } echo "<pre>"; print_r($ids); echo "</pre>"; } public static function createOrder($o) { $siteId = Context::getCurrent()->getSite(); $currencyCode = Option::get('sale', 'default_currency', 'RUB'); $basket = Basket::create($siteId); foreach ($o['products'] as $product) { $item = $basket->createItem("catalog", $product["offer_id"]); $item->setFields(array( 'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider', 'NAME' => $product["name"], 'PRICE' => $product["price"], 'CURRENCY' => $currencyCode, 'QUANTITY' => $product["quantity"], )); $item->markFieldCustom('PRICE'); $item->setField('PRICE', $product["price"]); } $order = Order::create($siteId, Setting::UserId); $personTypeId = Setting::PersonTypeId; $order->setPersonTypeId($personTypeId); $order->setBasket($basket); //служба доставки $deliveryId = Setting::DeliveryMethod[$o['delivery_method_id']]; $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( Delivery\Services\Manager::getObjectById($deliveryId) ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); foreach ($basket as $basketItem) { $item = $shipmentItemCollection->createItem($basketItem); $item->setQuantity($basketItem->getQuantity()); } //платежная система $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem( PaySystem\Manager::getObjectById(Setting::PaySystemId) ); $payment->setField("SUM", $order->getPrice()); $payment->setField("CURRENCY", $order->getCurrency()); //свойства заказа $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection as $item) { //заполняем свойства заказа } $order->setField('DATE_INSERT', self::getDateFormatSite($o['in_process_at'])); $order->setField('STATUS_ID', Setting::StatusDefaultID); $order->setField('CURRENCY', $currencyCode); $ord_id = 0; $r = $order->save(); if (!$r->isSuccess()) { Loglib::log($o['posting_number'] . ' ' . var_dump($r->getErrorMessages()), Setting::MODULE); } else { Loglib::log('Заказ ' . $o['posting_number'] . ' создан! Номер заказа ' . $order->getId(), Setting::MODULE); $ord_id = $r->GetId(); } return $ord_id; } |
Это вывод из функции getPosting. 0-это не дошли до создания заказа, по всяким проверкам. "заказ уже есть в бд" - это была проверка на наличие в бд заказа
Код |
---|
Array ( [0] => Заказ уже есть в бд [1] => Заказ уже есть в бд [2] => Заказ уже есть в бд [3] => Заказ уже есть в бд [4] => 0 [5] => Заказ уже есть в бд [6] => Заказ уже есть в бд [7] => Заказ уже есть в бд [8] => Заказ уже есть в бд [9] => Заказ уже есть в бд [10] => Заказ уже есть в бд [11] => Заказ уже есть в бд [12] => Заказ уже есть в бд [13] => Заказ уже есть в бд [14] => Заказ уже есть в бд [15] => Заказ уже есть в бд [16] => Заказ уже есть в бд [17] => 0 [18] => Заказ уже есть в бд [19] => Заказ уже есть в бд [20] => Заказ уже есть в бд [21] => Заказ уже есть в бд [22] => Заказ уже есть в бд ) |
А это лог одного из заказов, из которого видно, что форич дважды проходил массив и запускал функцию создания заказа тоже дважды:
Код |
---|
------------------------------ !!! 29-01-2022 13:24:24 a1 ------------------------------ Мы еще в фориче, Попытка создать заказ 55524814-0019-3 ------------------------------ !!! 29-01-2022 13:24:24 a1 ------------------------------ Запустилась функция создания заказа 55524814-0019-3 ------------------------------ !!! 29-01-2022 13:24:24 a1 ------------------------------ Попытка создать заказ 55524814-0019-3 ------------------------------ !!! 29-01-2022 13:24:25 a1 ------------------------------ Заказ 55524814-0019-3 создан! Номер заказа 46941 ------------------------------ !!! 29-01-2022 13:24:33 a1 ------------------------------ Мы еще в фориче, Попытка создать заказ 55524814-0019-3 ------------------------------ !!! 29-01-2022 13:24:33 a1 ------------------------------ Запустилась функция создания заказа 55524814-0019-3 ------------------------------ !!! 29-01-2022 13:24:33 a1 ------------------------------ Попытка создать заказ 55524814-0019-3 ------------------------------ !!! 29-01-2022 13:24:33 a1 ------------------------------ Заказ 55524814-0019-3 в базе данных уже есть!!! |