การนำเข้าคำสั่งซื้อจาก CSV เป็น Magento โดยทางโปรแกรม


17

เราเปลี่ยนจากระบบจุดขายเก่าที่ล้าสมัยไปเป็นการใช้ Magento 1.7 เป็น POS ของเราโดยเฉพาะ ไม่คาดคิดหนึ่งในความท้าทายที่เราเผชิญคือการบันทึกเกือบ 20 ปีจากระบบเก่าสู่ Mage โดยไม่ต้องเกิดภัยพิบัติ

นอกเหนือจากความท้าทายในการโยกย้ายบันทึกลูกค้าปัญหาที่ฉันมุ่งเน้นในคำถามนี้ก็คือฉันจะย้ายข้อมูลคำสั่งซื้อในอดีตจาก POS เก่าไปยัง Mage ได้อย่างไร ฉันไม่แน่ใจ 100% เกี่ยวกับตัวเลขที่แน่นอนเมื่อมีการสั่งซื้อจำนวนมากที่เรากำลังพูดถึง แต่ฉันจะบอกว่าอย่างน้อยหนึ่งล้าน

นี่คือสิ่งที่ฉันคิดในแง่ของวิธีการนี้:

  1. คิดออกว่าข้อมูลจะต้องมีการจัดรูปแบบสำหรับวีโอไอพีเพื่อเล่นกับมัน ไม่ว่าเราจะนำออกมาจาก POS เก่าในรูปแบบที่ใช้งานได้หรือไม่ แต่ลองคิดดูสักครู่ว่ามันจะไปได้ดีหรือไม่
  2. สร้างไฟล์. CSV ด้วยข้อมูลประวัติที่มีการจัดรูปแบบเป็นอย่างดี
  3. ค้นหาวิธีการอ่าน. CSV ให้เป็นวีโอไอพี $orderวัตถุในแต่ละแถว -> save ()
  4. กำไร!

ปัญหาของฉันคือฉันสับสนเล็กน้อยเกี่ยวกับวิธีเข้าใกล้จุดที่ 2 และ 3 ไปคิด ฉันสามารถจัดรูปแบบข้อมูลที่ออกมาจาก POS เก่า แต่ฉันต้องการแม้ว่ามันจะยุ่งยากและเกี่ยวข้องกับ Perl แต่เมื่อฉันมีไฟล์. CSV (หรือไฟล์ประเภทใดก็ตามที่ใช้งานได้จริงสำหรับกระบวนการนี้) ฉันค่อนข้างชัดเจน ฉันจะป้อนเข้าวัตถุคำสั่งของวีโอไอพีได้อย่างไร

ฉันได้ทำ Googling มาแล้วและฉันก็ได้ตัวอย่างของคนที่ใช้วัตถุคำสั่งของ 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();

ดังนั้นนี่คือคำถามเฉพาะของฉัน:

  1. ดูเหมือนว่าวิธีนี้จะทำให้ปัญหานี้หมดไปหรือไม่? และถ้าไม่คุณคิดว่าฉันจะจัดการกับปัญหานี้เหมือนคนโง่น้อยลงได้อย่างไร
  2. หากนี่เป็นวิธีการที่ละเอียดอ่อนฉันต้องมี. CSV ที่แตกต่างกันสำหรับแต่ละรุ่นที่เรียกใช้โดยกระบวนการสั่งซื้อหรือไม่ เช่น Mage :: getModel ('sales / order'), Mage :: getModel ('sales / order_address') เป็นต้น?
  3. เป็น. CSV แม้แต่วิธีที่จะไป?
  4. ฉันจะป้อนข้อมูลของฉันในวัตถุนี้ได้อย่างไรไม่ว่าข้อมูลนั้นจะอยู่ใน. CSV หรือคุณมีอะไรบ้าง
  5. คุณจะ จำกัด เรื่องค่าใช้จ่ายอย่างไร

แม้ว่าฉันจะคิดถึงสิ่งนี้ในลักษณะที่งี่เง่า แต่คุณบอกฉันได้มาก

ขอบคุณขอบคุณขอบคุณ!


1
ไม่สำคัญกับกรณีของคุณ แต่ให้ดูคำถามก่อนหน้านี้ของฉันและคำตอบ @BenMarks ซึ่งเกี่ยวข้องกับการแยก CSV ใน Magento และอาจมีประโยชน์ magento.stackexchange.com/questions/232/…
pspahn

1
คุณอาจต้องการดูสิ่งนี้เพื่อเป็นแรงบันดาลใจ: github.com/avstudnitz/AvS_FastSimpleImportส่วนใหญ่จะเน้นไปที่การนำเข้าผลิตภัณฑ์และลูกค้า แต่เป็นระบบการนำเข้าที่รวดเร็ว ในขณะที่คุณกำลังพูดถึงบันทึกนับล้านคุณอาจต้องการบางสิ่งที่รวดเร็ว ฉันใช้สิ่งนี้ก่อนที่จะนำเข้าไฟล์ CSV ของผลิตภัณฑ์ คุณเพิ่งอ่านไฟล์ CSV และแปลงข้อมูลเป็นอาร์เรย์ ฉันยังไม่ได้พยายามขยายโมดูลนี้เพื่อใช้คำสั่งซื้อ ดังนั้นฉันจึงไม่รู้เลยว่ามันจะได้ผลยังไง โชคดี.
Vicky

ดังนั้นการทำให้ Dataflow เป็นแบบอัตโนมัติ - การนำเข้าเพื่อนำเข้าคำสั่งซื้อเป็นความคิดที่ไม่ดีใช่หรือไม่ จากสิ่งที่ฉันอ่านดูเหมือนว่าจะเป็นวิธีแก้ปัญหาที่ค่อนข้างธรรมดา
2557

คำตอบ:


9

แปลกใจที่ไม่มีคำตอบด้วยคะแนนโหวต / จำนวนมากดังนั้นฉันจะกัด:

  1. นี้จะขึ้นอยู่กับระบบ POS เก่านวดข้อมูลในระหว่างการนำเข้า
  2. ทำความคุ้นเคยกับโดยเฉพาะอย่างยิ่งVarien_Io Varien_Io_Fileเนื่องจากคุณมักจะจัดการกับเช่นคอลเลกชันขนาดใหญ่ของข้อมูลเก็บไว้ในใจกับการใช้งานเช่นลำธารและStreamReadCsv รายละเอียดเพิ่มเติมเกี่ยวกับการเป็น "กระแส" หากไม่มีสตรีมหรือการอ่าน / เขียนเชิงเส้นคุณอาจพบปัญหาหน่วยความจำด้วยวิธีการโหลด / เขียนอื่น ๆStreamWriteCsv

ด้วยการกล่าวข้างต้นนี่คือตัวอย่าง: (แหล่งAtwix.com )

/**
 * Generates CSV file with product's list according to the collection in the $this->_list
 * @return array
 */
public function generateMlnList()
{
    if (!is_null($this->_list)) {
        $items = $this->_list->getItems();
        if (count($items) > 0) {

            $io = new Varien_Io_File();
            $path = Mage::getBaseDir('var') . DS . 'export' . DS;
            $name = md5(microtime());
            $file = $path . DS . $name . '.csv';
            $io->setAllowCreateFolders(true);
            $io->open(array('path' => $path));
            $io->streamOpen($file, 'w+');
            $io->streamLock(true);

            $io->streamWriteCsv($this->_getCsvHeaders($items));
            foreach ($items as $product) {
                $io->streamWriteCsv($product->getData());
            }

            return array(
                'type'  => 'filename',
                'value' => $file,
                'rm'    => true // can delete file after use
            );
        }
    }
}

สำหรับการนำเข้าคำสั่งซื้อตัวอย่างนี้ช่วยได้มากที่สุด: (ที่มา: pastebin )

<?php

require_once 'app/Mage.php';

Mage::app();

$quote = Mage::getModel('sales/quote')
    ->setStoreId(Mage::app()->getStore('default')->getId());

if ('do customer orders') {
    // for customer orders:
    $customer = Mage::getModel('customer/customer')
        ->setWebsiteId(1)
        ->loadByEmail('customer@example.com');
    $quote->assignCustomer($customer);
} else {
    // for guesr orders only:
    $quote->setCustomerEmail('customer@example.com');
}

// add product(s)
$product = Mage::getModel('catalog/product')->load(8);
$buyInfo = array(
    'qty' => 1,
    // custom option id => value id
    // or
    // configurable attribute id => value id
);
$quote->addProduct($product, new Varien_Object($buyInfo));

$addressData = array(
    'firstname' => 'Test',
    'lastname' => 'Test',
    'street' => 'Sample Street 10',
    'city' => 'Somewhere',
    'postcode' => '123456',
    'telephone' => '123456',
    'country_id' => 'US',
    'region_id' => 12, // id from directory_country_region table
);

$billingAddress = $quote->getBillingAddress()->addData($addressData);
$shippingAddress = $quote->getShippingAddress()->addData($addressData);

$shippingAddress->setCollectShippingRates(true)->collectShippingRates()
        ->setShippingMethod('flatrate_flatrate')
        ->setPaymentMethod('checkmo');

$quote->getPayment()->importData(array('method' => 'checkmo'));

$quote->collectTotals()->save();

$service = Mage::getModel('sales/service_quote', $quote);
$service->submitAll();
$order = $service->getOrder();

printf("Created order %s\n", $order->getIncrementId());

ด้วยตัวอย่างที่คุณมีอยู่ตอนนี้จะเป็นทรัพยากรที่หนักเนื่องจากมีการMage::getModel(...โทรในลูป foreach ซึ่งเป็นแนวปฏิบัติที่ไม่ดีและมักจะหมดเวลาหรือเติมหน่วยความจำอย่างรวดเร็ว โดยเฉพาะอย่างยิ่งถ้าคุณมีสิ่งนี้ห่อหุ้มอยู่ข้างหน้า / ขณะอื่น

นี้...

foreach ($products as $productId=>$product) {
  $_product = Mage::getModel('catalog/product')->load($productId);

ควรมีลักษณะดังนี้:

$_product = Mage::getModel('catalog/product');
foreach ($products as $productId=>$product) {
  $_product->load($productId);

ฉันจะไม่พยายามลองและเชื่อมโยงบิตข้อมูล CSV ทุกชิ้นกับวัตถุ Magento มันจะบ้าและบิตของ overkill $model->load(EntityId)ให้กับจุดเข้ารูปแบบของทรัพยากร

โปรดทราบด้วยหากคุณพยายามนำเข้าเกิน 100k +คำสั่งซื้อฉันจะต้องกังวลเกี่ยวกับประสิทธิภาพหลังจากการนำเข้าขนาดใหญ่ตามที่จำเป็นเพื่อให้ MySQL ปรับให้รองรับปริมาณมากเช่นนั้นไม่พูดถึงมากเกินไปถ้าฉันไม่เข้าใจผิด และทำงานได้ไม่ดีภายใต้ปริมาณการรับส่งข้อมูลสูง มีเหตุผลที่วีโอไอพีเอ็นเตอร์ไพรส์มีโมดูลเก็บคำสั่งขายเพื่อดึงข้อมูลเก่าออกจากตารางคำสั่งขาย "ธุรกรรม" เพื่อป้องกันข้อมูลที่ป่องๆ / อับที่ไม่จำเป็นสำหรับการสั่งซื้อ

หากต้องการสรุป: ฉันจะนำข้อกำหนดและความต้องการของธุรกิจมาจัดเก็บข้อมูลขนาดใหญ่เช่นนี้หากการรายงานอย่างหมดจดมีทางเลือกที่ดีกว่าในการเลือกชุดข้อมูลนี้มากกว่า Magento



3

การพิจารณาเกี่ยวกับผลกระทบของคำสั่งซื้อในอดีตเหล่านี้จะมีผลต่อประสิทธิภาพของวีโอไอพี / mysql บวกกับความจริงที่ว่าผลิตภัณฑ์ใด ๆ ที่ถูกยกเลิกจะต้องถูกนำเข้าด้วยเช่นกัน เช่นดัชนี elasticsearch และค้นหาตามความต้องการ เช่นหน้าประวัติการสั่งซื้อของลูกค้า


1

จากการสร้างใบเสนอราคาแล้วการสร้างคำสั่งซื้อใช้เวลานานเกินไปสำหรับข้อมูลขนาดใหญ่ของการนำเข้าคำสั่งซื้อ

ดังนั้นฉันได้วิจัยและพบข้อสรุปของข้อมูลการนำเข้าคำสั่งซื้อจำนวนมากด้วยคำสั่ง mysql:

  1. ฉันแทรกข้อมูลลงในตารางคำสั่งซื้อเท่านั้น

  2. อัปเดตincrement_idเพื่อรับรู้วีโอไอพี 1.x ลำดับสุดท้ายincrement_idคือสิ่งนี้

  3. แบบสอบถามนี้ไม่ได้สร้างใบเสนอราคาใบแจ้งหนี้และการจัดส่งใด ๆ :

    แบบสอบถาม SQL: -

    1. 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);

    2. 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");

    3. 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","","")

    4. 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","","");

    5. 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);

    6. 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);

    7. 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");

    8. UPDATE `eav_entity_store` SET increment_last_id = 100026111 WHERE `entity_type_id` = 5 AND `store_id` = 1;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.