Wir wechseln von einem veralteten Point-of-Sale-System zu Magento 1.7 ausschließlich als POS. Es ist nicht unerwartet, dass wir vor der Herausforderung stehen, fast 20 Jahre Rekorde vom alten System ohne Katastrophe an Mage zu bringen.
Abgesehen von der Herausforderung, sogar Kundendatensätze zu migrieren, besteht das Problem, auf das ich mich in dieser Frage konzentriere, darin, wie ich historische Auftragsdaten vom alten POS zu Mage migrieren werde. Ich bin mir nicht hundertprozentig sicher, ob es sich um genaue Zahlen handelt, wenn es um viele Bestellaufzeichnungen geht, aber ich würde sagen, mindestens eine Million.
Ich überlege, wie ich das angehen soll:
- Finde heraus, wie genau die Daten formatiert werden müssen, damit Magento gut damit umgehen kann. Ob wir es aus dem alten POS in einem funktionierenden Format herausholen können, ist fraglich, aber nehmen wir für einen Moment an, dass dies gut geht ...
- Erstellen Sie eine CSV-Datei mit gut formatierten Verlaufsdaten
- Finde einen Weg, um das .CSV zeilenweise in Magentos
$order
Objekt einzulesen -> save () - Profitieren!
Mein Problem ist, dass ich ein bisschen unklar bin, wie ich mich Punkt 2 und 3 nähere. Ich kann die Daten aus dem alten POS formatieren, wie ich es brauche, auch wenn es sehr umständlich ist und Perl involviert, aber sobald ich die CSV-Datei habe (oder welcher Dateityp auch immer für diesen Prozess funktionieren würde), bin ich mir ziemlich unklar wie ich es in Magentos Bestellobjekt einspeisen würde.
Ich habe ein bisschen gegoogelt und mir Beispiele ausgedacht, bei denen Benutzer das Bestellobjekt von Mage zum programmgesteuerten Importieren von Bestellungen verwenden, aber nur wenig darüber, wie sie andere Datenquellen als den Front-End-Wagen mit dem Objekt verbinden. Ich habe eine Version des Bestellobjekts untersucht:
$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();
Also hier sind meine spezifischen Fragen:
- Scheint dies eine sogar annähernd sinnliche Annäherung an dieses Problem zu sein? Und wenn nicht, wie könnte ich mich dieser Angelegenheit weniger idiotisch nähern?
- Wenn dies ein sinnvoller Ansatz ist, benötige ich für jedes Modell, das vom Bestellvorgang aufgerufen wird, eine andere CSV-Datei? zB Mage :: getModel ('sales / order'), Mage :: getModel ('sales / order_address'), etc?
- Ist eine .CSV überhaupt der richtige Weg?
- Wie würde ich meine Daten in dieses Objekt einspeisen, ob diese Daten in einer CSV-Datei enthalten sind oder was haben Sie?
- Wie würden Sie den Overhead begrenzen?
Auch wenn ich total idiotisch darüber nachdenke und du mir das erzählst, schätze ich jeden Input wirklich.
Danke danke danke!
quelle
Antworten:
Überrascht keine Antworten mit so vielen Stimmen / Ansichten, so werde ich beißen:
Varien_Io
insbesondere mitVarien_Io_File
. Da Sie höchstwahrscheinlich mit einer so großen Datenmenge zu tun haben, sollten Sie Streams wieStreamReadCsv
und verwendenStreamWriteCsv
. Weitere Details zu einem "Stream" . Ohne Stream oder lineares Lesen / Schreiben können Speicherprobleme mit anderen Lade- / Schreibmethoden auftreten.Mit dem oben Gesagten ist hier ein Beispiel: (Quelle Atwix.com )
Für den Import von Bestellungen hat dieses Beispiel am meisten geholfen: (Quelle: pastebin )
Mit dem Beispiel, das Sie jetzt haben, werden Sie ressourcenintensiv sein, da es
Mage::getModel(...
Aufrufe in foreach-Schleifen gibt, was eine schlechte Praxis ist und höchstwahrscheinlich entweder eine Zeitüberschreitung verursacht oder den Speicher ziemlich schnell auffüllt. Vor allem, wenn Sie dies in eine andere Zeit eingewickelt haben.Dies...
Sollte aussehen, wie:
Ich würde nicht versuchen, alle CSV-Datenbits mit Magento-Objekten zu verknüpfen . Es wäre Wahnsinn und ein bisschen übertrieben, mit Ressourcenmodell Einstiegspunkten von zu halten
$model->load(EntityId)
.Beachten Sie auch, wenn Sie versuchen, mehr als 100.000 Bestellungen zu importieren , dass ich nach den großen Importen um die Leistung besorgt bin, da MySQL für die Verarbeitung so großer Mengen optimiert bleiben muss. und nicht gut unter hohem Volumen / Verkehr durchführen. Es gibt einen Grund, warum Magento Enterprise über ein Modul für das Kundenauftragsarchiv verfügt, mit dem alte Daten aus den "Transaktions" -Kundenauftragstabellen abgerufen werden können, um zu verhindern, dass veraltete Daten aufgebläht werden und nicht zum Entgegennehmen von Bestellungen benötigt werden.
To Wrap: Ich würde die Anforderungen und Bedürfnisse des Unternehmens zur Speicherung so großer Datenmengen ansprechen, wenn es lediglich Berichte gibt, für die es bessere Alternativen als für Magento gibt.
quelle
Wenn Sie über die Auswirkungen dieser historischen Bestellungen auf die Leistung von Magento / MySQL nachdenken und die Tatsache, dass nicht mehr unterstützte Produktlinien ebenfalls importiert werden müssen, könnte es sich lohnen, die historischen Bestellungen zusammen mit dem Kunden und den Produkten in einem Ordner zu speichern wie ein Elasticsearch-Index und führen Sie eine Suche nach Bedarf durch. dh die Kundenbestellhistorie Seite.
quelle
Das Erstellen eines Angebots und das anschließende Erstellen einer Bestellung nimmt zu viel Zeit in Anspruch, um umfangreiche Daten für den Import von Bestellungen zu erhalten.
Also habe ich recherchiert und die Schlussfolgerung von riesigen Auftragsimportdaten mit MySQL-Abfrage gefunden:
Ich habe die Daten nur in Auftragstabellen eingefügt.
Aktualisieren Sie das
increment_id
, um Magento 1.x zu erkennen, die letzte Bestellungincrement_id
ist diesDiese Abfrage erstellt kein Angebot, keine Rechnung und keinen Versand:
SQL-Abfragen: -
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;
quelle