Przechodzimy ze starego, przestarzałego systemu punktów sprzedaży na używanie Magento 1.7 wyłącznie jako naszego punktu sprzedaży. Nie jest niespodzianką, że jednym z wyzwań, przed którymi stoimy, jest to, jak uzyskać prawie 20 lat nagrań ze starego systemu do Mage bez katastrofy.
Odkładając na bok wyzwanie nawet migracji danych klientów, problem, na którym koncentruję się w tym pytaniu, polega na tym, w jaki sposób zamierzam migrować historyczne dane zamówienia ze starego punktu sprzedaży do Mage. Nie jestem w 100% pewien dokładnych liczb, kiedy mówimy o wielu rekordach zamówień, ale powiedziałbym, że co najmniej milion.
Oto, co myślę, jeśli chodzi o podejście do tego:
- Dowiedz się dokładnie, jak należy sformatować dane, aby Magento dobrze się z nimi bawił. To, czy uda nam się to zrobić ze starego POS w formacie, który działa, jest wątpliwe, ale załóżmy przez chwilę, że idzie dobrze ...
- Utwórz plik .CSV z ładnie sformatowanymi danymi historycznymi
- Znajdź sposób na odczytanie tego .CSV do
$order
obiektu Magento rząd po rzędzie -> save () - Zysk!
Mój problem polega na tym, że jestem trochę rozmyślny, jak podejść do punktu 2 i 3, idź. Mogę sformatować dane wychodzące ze starego POS, jednak potrzebuję, nawet jeśli jest to bardzo uciążliwe i dotyczy Perla, ale kiedy już mam plik .CSV (lub inny typ pliku, który faktycznie działałby dla tego procesu), jestem dość niejasny jak chciałbym wprowadzić go do obiektu zamówienia Magento.
Zrobiłem trochę googlingu i wymyśliłem przykłady ludzi używających obiektu zamówienia Mage'a do programowego importowania zamówień, ale mało dyskusji na temat tego, w jaki sposób łączą źródła danych inne niż przedni koszyk z tym obiektem. Studiowałem wersję obiektu zamówienia:
$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();
Oto moje szczegółowe pytania:
- Czy to wydaje się być nawet sensownie podejściem do tego problemu? A jeśli nie, jak myślisz, jak mógłbym podejść do tego problemu jak mniej idiota?
- Jeśli jest to sensowne podejście, czy potrzebuję innej .CSV dla każdego modelu wywołanego przez proces zamówienia? tj. Mage :: getModel („sprzedaż / zamówienie”), Mage :: getModel („sprzedaż / adres_ zamówienia”) itp.?
- Czy .CSV jest jeszcze właściwą drogą?
- Jak mam wprowadzić moje dane do tego obiektu, niezależnie od tego, czy dane te są zawarte w .CSV, czy co masz?
- Jak byś zajął się ograniczaniem kosztów ogólnych?
Nawet jeśli myślę o tym w całkowicie idiotyczny sposób, a ty mi to mówisz, naprawdę doceniam każdy wkład.
Dziekuję Dziekuję Dziękuję!
źródło
Odpowiedzi:
Zaskoczony brak odpowiedzi tyloma głosami / widokami, więc ugryzę:
Varien_Io
szczególnieVarien_Io_File
. Ponieważ najprawdopodobniej będziesz mieć do czynienia z tak dużą kolekcją danych, pamiętaj o używaniu strumieni takich jakStreamReadCsv
iStreamWriteCsv
. Więcej szczegółów na temat „strumienia” . Bez strumienia lub liniowego odczytu / zapisu możesz napotkać problemy z pamięcią w przypadku innych metod ładowania / zapisu.Powyżej wspomniany jest przykład: (źródło Atwix.com )
Jeśli chodzi o importowanie zamówień, ten przykład pomógł najbardziej: (Źródło: pastebin )
Na tym przykładzie będziesz mieć duże zasoby, ponieważ
Mage::getModel(...
w pętlach foreach występują wezwania, co jest złą praktyką i najprawdopodobniej albo przekroczy limit czasu, albo zapełni pamięć dość szybko. Zwłaszcza jeśli masz to zapakowane w innym foreach / while.To...
Powinien wyglądać następująco:
Nie próbowałbym powiązać wszystkich bitów danych CSV z obiektami Magento. Byłoby to szaleństwo i odrobina przesady, z punktami wejścia modelu zasobów
$model->load(EntityId)
.Pamiętaj również, jeśli próbujesz zaimportować ponad 100 000+ zamówień, byłbym zaniepokojony wydajnością po dużym imporcie, ponieważ jest to konieczne, aby utrzymać MySQL dostrojone do obsługi tak dużych woluminów, nie wspominając zbytnio, jeśli nie mylę się, że obiekty sprzedaży są nadal oparte na EAV, i nie działają dobrze przy dużym natężeniu ruchu. Istnieje powód, dla którego Magento Enterprise ma moduł Archiwum zamówień sprzedaży, aby wyciągać stare dane z „transakcyjnych” tabel zamówień sprzedaży, aby zapobiec rozdętym / nieaktualnym danym, które nie są potrzebne do przyjmowania zamówień.
Podsumowując: Chciałbym poruszyć wymagania i potrzeby firmy w zakresie przechowywania tak dużych danych, jeśli tylko raportowanie ma lepsze alternatywy dla tego zestawu niż Magento.
źródło
Biorąc pod uwagę wpływ tych historycznych zamówień na wydajność magento / mysql oraz fakt, że wszelkie linie produktów, które zostały wycofane, również będą musiały zostać zaimportowane, warto rozważyć przechowywanie historycznych zamówień wraz z klientem i produktami w czymś jak indeks elasticsearch i przeprowadzaj wyszukiwanie na żądanie. tzn. strona historii zamówień klientów.
źródło
Utworzenie oferty, a następnie utworzenie zamówienia zajmuje zbyt dużo czasu na ogromne dane importu zamówienia.
Tak więc zbadałem i znalazłem wniosek dotyczący ogromnych danych importu zamówień za pomocą zapytania mysql:
Wstawiłem dane tylko do tabel zamówień.
Aktualizacja
increment_id
rozpoznać Magento 1.x, że ostatnie zamówienieincrement_id
jest toTo zapytanie nie tworzy żadnej oferty, faktury ani wysyłki:
Zapytania 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","[email protected]","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,"[email protected]",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,"[email protected]","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,"[email protected]","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;
źródło