Мы переключаемся со старой, устаревшей системы для точек продаж на использование Magento 1.7 в качестве эксклюзивной торговой точки. Неудивительно, что одна из проблем, с которыми мы сталкиваемся, заключается в том, как получить почти 20-летнюю историю от старой системы к Магу без катастрофы.
Если оставить в стороне задачу даже переноса записей о клиентах, проблема, на которой я сосредоточусь в этом вопросе, заключается в том, как я собираюсь перенести исторические данные о заказах из старого POS в Mage. Я не уверен на 100% в точных цифрах, когда мы говорим о многих записях заказов, но я бы сказал, по крайней мере, миллион.
Вот что я думаю с точки зрения того, как подойти к этому:
- Выясните, как именно нужно отформатировать данные, чтобы Magento хорошо с ними играл. Сможем ли мы извлечь его из старого POS в формате, который работает, сомнительно, но давайте на минутку предположим, что все идет хорошо ...
- Создайте файл .CSV с красиво отформатированными историческими данными.
- Найдите способ прочитать этот .CSV в
$order
объект Magento строка за строкой -> save () - Прибыль!
Моя проблема в том, что я немного размышляю о том, как приблизиться к пунктам 2 и 3, иди разберись. Я могу отформатировать данные, поступающие из старого POS, так, как мне нужно, даже если это очень громоздко и требует использования Perl, но как только у меня есть файл .CSV (или любой другой тип файла, который на самом деле будет работать для этого процесса), я довольно неясен как бы я подал его в объект заказа Magento.
Я провел небольшое гугление и нашел примеры людей, использующих объект заказов Mage для программного импорта заказов, но мало обсуждал, как они соединяют источники данных, отличные от внешней корзины, с указанным объектом. Я изучал версию объекта заказа:
$id=1; // get Customer Id
$customer = Mage::getModel('customer/customer')->load($id);
$transaction = Mage::getModel('core/resource_transaction');
$storeId = $customer->getStoreId();
$reservedOrderId = Mage::getSingleton('eav/config')->getEntityType('order')->fetchNewIncrementId($storeId);
$order = Mage::getModel('sales/order')
->setIncrementId($reservedOrderId)
->setStoreId($storeId)
->setQuoteId(0)
->setGlobal_currency_code('USD')
->setBase_currency_code('USD')
->setStore_currency_code('USD')
->setOrder_currency_code('USD');
// set Customer data
$order->setCustomer_email($customer->getEmail())
->setCustomerFirstname($customer->getFirstname())
->setCustomerLastname($customer->getLastname())
->setCustomerGroupId($customer->getGroupId())
->setCustomer_is_guest(0)
->setCustomer($customer);
// set Billing Address
$billing = $customer->getDefaultBillingAddress();
$billingAddress = Mage::getModel('sales/order_address')
->setStoreId($storeId)
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
->setCustomerId($customer->getId())
->setCustomerAddressId($customer->getDefaultBilling())
->setCustomer_address_id($billing->getEntityId())
->setPrefix($billing->getPrefix())
->setFirstname($billing->getFirstname())
->setMiddlename($billing->getMiddlename())
->setLastname($billing->getLastname())
->setSuffix($billing->getSuffix())
->setCompany($billing->getCompany())
->setStreet($billing->getStreet())
->setCity($billing->getCity())
->setCountry_id($billing->getCountryId())
->setRegion($billing->getRegion())
->setRegion_id($billing->getRegionId())
->setPostcode($billing->getPostcode())
->setTelephone($billing->getTelephone())
->setFax($billing->getFax());
$order->setBillingAddress($billingAddress);
$shipping = $customer->getDefaultShippingAddress();
$shippingAddress = Mage::getModel('sales/order_address')
->setStoreId($storeId)
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
->setCustomerId($customer->getId())
->setCustomerAddressId($customer->getDefaultShipping())
->setCustomer_address_id($shipping->getEntityId())
->setPrefix($shipping->getPrefix())
->setFirstname($shipping->getFirstname())
->setMiddlename($shipping->getMiddlename())
->setLastname($shipping->getLastname())
->setSuffix($shipping->getSuffix())
->setCompany($shipping->getCompany())
->setStreet($shipping->getStreet())
->setCity($shipping->getCity())
->setCountry_id($shipping->getCountryId())
->setRegion($shipping->getRegion())
->setRegion_id($shipping->getRegionId())
->setPostcode($shipping->getPostcode())
->setTelephone($shipping->getTelephone())
->setFax($shipping->getFax());
$order->setShippingAddress($shippingAddress)
->setShipping_method('flatrate_flatrate')
->setShippingDescription($this->getCarrierName('flatrate'));
$orderPayment = Mage::getModel('sales/order_payment')
->setStoreId($storeId)
->setCustomerPaymentId(0)
->setMethod('purchaseorder')
->setPo_number(' - ');
$order->setPayment($orderPayment);
// let say, we have 2 products
$subTotal = 0;
$products = array(
'1001' => array(
'qty' => 1
),
'1002' ->array(
'qty' => 3
),
);
foreach ($products as $productId=>$product) {
$_product = Mage::getModel('catalog/product')->load($productId);
$rowTotal = $_product->getPrice() * $product['qty'];
$orderItem = Mage::getModel('sales/order_item')
->setStoreId($storeId)
->setQuoteItemId(0)
->setQuoteParentItemId(NULL)
->setProductId($productId)
->setProductType($_product->getTypeId())
->setQtyBackordered(NULL)
->setTotalQtyOrdered($product['rqty'])
->setQtyOrdered($product['qty'])
->setName($_product->getName())
->setSku($_product->getSku())
->setPrice($_product->getPrice())
->setBasePrice($_product->getPrice())
->setOriginalPrice($_product->getPrice())
->setRowTotal($rowTotal)
->setBaseRowTotal($rowTotal);
$subTotal += $rowTotal;
$order->addItem($orderItem);
}
$order->setSubtotal($subTotal)
->setBaseSubtotal($subTotal)
->setGrandTotal($subTotal)
->setBaseGrandTotal($subTotal);
$transaction->addObject($order);
$transaction->addCommitCallback(array($order, 'place'));
$transaction->addCommitCallback(array($order, 'save'));
$transaction->save();
Итак, вот мои конкретные вопросы:
- Похоже ли это на хоть какой-то чувственный подход к этой проблеме? И, если нет, как вы думаете, я мог бы подойти к этому вопросу, как меньше идиот?
- Если это разумный подход, нужно ли мне разные .CSV для каждой модели, вызванной процессом заказа? то есть Mage :: getModel ('sales / order'), Mage :: getModel ('sales / order_address') и т. д.?
- .CSV - это даже путь?
- Как бы я передал свои данные этому объекту, независимо от того, содержатся ли эти данные в .CSV или что у вас есть?
- Как бы вы пошли на ограничение накладных расходов?
Даже если я думаю об этом совершенно идиотски, а вы мне так много говорите, я действительно ценю любой вклад.
Спасибо Спасибо спасибо!
источник
Ответы:
Не удивил ни одного ответа с таким количеством голосов / просмотров, поэтому я укушу:
Varien_Io
, в частности, сVarien_Io_File
. Поскольку вы, скорее всего, будете иметь дело с таким большим набором данных, имейте в виду использование потоков, таких какStreamReadCsv
иStreamWriteCsv
. Подробнее о «потоке» . Без потокового или линейного чтения / записи вы можете столкнуться с проблемами памяти с другими методами загрузки / записи.С учетом сказанного здесь приведен пример: (источник Atwix.com )
Что касается импорта заказов, этот пример помог больше всего: (Источник: pastebin )
В примере, который у вас сейчас есть, будет много ресурсов, так как
Mage::getModel(...
в циклах foreach есть вызовы, что является плохой практикой и, скорее всего, будет либо превышено по времени, либо достаточно быстро заполнит память. Особенно, если вы завернули это в другой foreach / while.Эта...
Должно выглядеть так:
Я бы не стал пытаться связать каждый бит данных CSV с объектами Magento. Это было бы безумием и немного излишним, продолжайте с точки входа модели ресурсов
$model->load(EntityId)
.Также обратите внимание, если вы пытаетесь импортировать более 100k + я буду обеспокоен производительностью после большого импорта, поскольку необходимо поддерживать настройку MySQL для обработки таких больших объемов, не слишком упоминать, если я не ошибаюсь, объекты продаж по-прежнему основаны на EAV и не работают хорошо при большом объеме / трафике. Существует причина, по которой у Magento Enterprise есть модуль «Архив заказов на продажу», позволяющий извлекать старые данные из «транзакционных» таблиц заказов на продажу для предотвращения раздутых / устаревших данных, которые не нужны для приема заказов.
Подводя итог: я бы поднял требования и потребности бизнеса для хранения таких больших данных, если в его чисто отчетных данных есть лучшие альтернативы, чем Magento.
источник
Думая о влиянии этих исторических заказов на производительность magento / mysql, а также о том, что любые производственные линии, которые были прекращены, также необходимо импортировать, тогда стоит подумать о хранении исторических заказов вместе с заказчиком и продуктами в каком-то месте. например, индекс эластичного поиска и поиск по требованию. то есть страница истории заказов клиентов.
источник
От создания предложения до создания заказа отнимает слишком много времени для огромных данных об импорте заказа.
Итак, я исследовал и нашел вывод огромных данных по импорту заказов с помощью запроса MySQL:
Я вставил данные только в таблицы заказов.
Обновите
increment_id
для распознавания magento 1.x, что последний заказincrement_id
этоЭтот запрос не создает никаких расценок, счетов и отгрузок:
SQL-запросы: -
INSERT INTO `sales_flat_order` (state, status, shipping_description, store_id, customer_id, base_discount_invoiced, base_grand_total, base_shipping_amount, base_shipping_invoiced, base_subtotal, base_subtotal_invoiced, base_tax_amount, base_tax_invoiced, base_total_invoiced, base_total_invoiced_cost, base_total_paid, discount_invoiced, grand_total, shipping_amount, shipping_invoiced, subtotal, subtotal_invoiced, tax_amount, tax_invoiced, total_invoiced, total_paid, customer_group_id, increment_id, base_currency_code, global_currency_code, customer_email, customer_firstname, customer_lastname, customer_middlename, order_currency_code, shipping_method, store_currency_code, store_name, created_at, updated_at, total_item_count, hidden_tax_invoiced, base_hidden_tax_invoiced, is_valid) VALUES ("complete", "complete", "Flat Rate - Fixed", 1, 38322,0,225.7,0,0,214.95,214.95,10.75,10.75,225.7, 0,225.7, 0,225.7,0,0,214.95,214.95,10.75,10.75,225.7,225.7, 1,100026111,"CAD","CAD","abc@gmail.com","abc","abc","", "CAD", "flatrate_flatrate", "CAD", "Main Website\nMain Website Store\nOnline Catalog","2012-01-17 00:00:00","2012-01-17 00:00:00",5,0,0,0);
INSERT INTO `sales_flat_order_grid` (entity_id, status, shipping_description, shipping_method, store_id, customer_id, customer_email, total_qty_ordered, base_grand_total, base_total_paid, grand_total, total_paid, increment_id, base_currency_code, order_currency_code, store_name, created_at, updated_at, payment_validated, billing_name, shipping_name) VALUES (5, "complete", "Flat Rate - Fixed", "flatrate_flatrate", 1, 38322,"abc@gmail.com",5,225.7,225.7,225.7,225.7,100026111,"CAD", "CAD", "Main Website\nMain Website Store\nOnline Catalog","2012-01-17 00:00:00","2012-01-17 00:00:00",1,"abc abc","abc abc");
INSERT INTO `sales_flat_order_address` (parent_id, region_id, customer_id, email, region, postcode, lastname, street, city, telephone, country_id, firstname, address_type, middlename, nick_name) VALUES (5,68,38322,"alicjakeller@gmail.com","Manitoba","R3W 1G9","abc","1607 Concordia Ave E","Winnipeg","204 667-5540","CA","abc","billing","","")
INSERT INTO `sales_flat_order_address` (parent_id, region_id, customer_id, email, region, postcode, lastname, street, city, telephone, country_id, firstname, address_type, middlename, nick_name) VALUES (5,68,38322,"alicjakeller@gmail.com","Manitoba","R3W 1G9","abc","1607 Concordia Ave E","Winnipeg","204 667-5540","CA","abc","shipping","","");
INSERT INTO `sales_flat_order_item` (order_id, store_id, created_at, updated_at, product_id, product_type, sku, name, qty_ordered, price, base_price, original_price, base_original_price, row_total, base_row_total, price_incl_tax, base_price_incl_tax, row_total_incl_tax, base_row_total_incl_tax) VALUES (5,1,"2012-01-17 00:00:00","2012-01-17 00:00:00",4134,"simple","MET2240","ULTRA FLORA IB - 30 CAPS",4,44.99,44.99,44.99,44.99,179.96,179.96,44.99,44.99,179.96,179.96);
INSERT INTO `sales_flat_order_item` (order_id, store_id, created_at, updated_at, product_id, product_type, sku, name, qty_ordered, price, base_price, original_price, base_original_price, row_total, base_row_total, price_incl_tax, base_price_incl_tax, row_total_incl_tax, base_row_total_incl_tax) VALUES (5,1,"2012-01-17 00:00:00","2012-01-17 00:00:00",3198,"simple","WS1600","THYROSENSE - 180 VCAPS + 60 VCAPS FREE",1,34.99,34.99,34.99,34.99,34.99,34.99,34.99,34.99,34.99,34.99);
INSERT INTO `sales_flat_order_payment` (parent_id, base_shipping_amount, shipping_amount, base_amount_paid, amount_paid, base_amount_ordered, amount_ordered, method) VALUES (5,0,0,225.7,225.7,225.7,225.7, "cashondelivery");
UPDATE `eav_entity_store` SET increment_last_id = 100026111 WHERE `entity_type_id` = 5 AND `store_id` = 1;
источник