เหตุใดผลรวมการจัดส่งจึงตั้งค่า row_weight ของรายการเสนอราคาขายเป็น 0 หากการจัดส่งฟรีมีผล


21

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

พื้นหลัง

เราได้สร้างคูปองการจัดส่งฟรีโดยใช้ฟังก์ชันราคากฎตะกร้าสินค้ามาตรฐาน มีเงื่อนไขที่ไม่มีในคูปองที่มีและการดำเนินการเพียงว่ามีการตั้งค่าFree Shipping For matching items onlyเนื่องจากไม่มีเงื่อนไขจึงจะตั้งค่าfree_shippingเป็น1สำหรับทุกรายการที่ขายใบเสนอราคา

ตามธรรมเนียมเรายังเปิดใช้งานวิธีการจัดส่งฟรี Freeshippingรูปแบบผู้ให้บริการจะให้อัตราเมื่อใดก็ตามที่มีการร้องขอการจัดส่งฟรีหรือตรงกับผลรวมย่อยหรือเกินเกณฑ์ ( แต่เราไม่ได้ใช้ตัวเลือกการเกณฑ์) ดูMage_Shipping_Model_Carrier_Freeshipping::collectRates:

$this->_updateFreeMethodQuote($request);

if (($request->getFreeShipping()) // <-- This is the condition we're relying on
    || ($request->getBaseSubtotalInclTax() >=
        $this->getConfigData('free_shipping_subtotal'))
) {
    /* Snip: Add $0.00 method to the result */
}

และMage_Shipping_Model_Carrier_Freeshipping::_updateFreeMethodQuoteมีลักษณะเช่นนี้:

protected function _updateFreeMethodQuote($request)
{
    $freeShipping = false;
    $items = $request->getAllItems();
    $c = count($items);
    for ($i = 0; $i < $c; $i++) {
        if ($items[$i]->getProduct() instanceof Mage_Catalog_Model_Product) {
            if ($items[$i]->getFreeShipping()) {
                $freeShipping = true;
            } else {
                return;
            }
        }
    }
    if ($freeShipping) {
        $request->setFreeShipping(true);
    }
}

ดังนั้นตราบใดที่รายการทั้งหมดได้free_shippingตั้งค่าเป็นความจริง (ซึ่งพวกเขาจะเนื่องจากคูปอง) เราควรจัดส่งฟรี และเราทำ!

ปัญหา

อย่างไรก็ตามมีผลข้างเคียงที่สำคัญ: วิธีการจัดส่งใด ๆ ที่ขึ้นอยู่กับสินค้าrow_weight(เช่นเดียวกับผู้ให้บริการ FedEx รุ่นที่กำหนดเองของเรา) จะไม่สามารถคำนวณอัตราการจัดส่งที่เหมาะสมได้เนื่องจากแต่ละรายการrow_weightถูกตั้งค่า0เมื่อเปิดใช้งานการจัดส่งฟรี

ที่น่าสนใจพอไม่มีวีโอไอพีของผู้ให้บริการจัดส่งเริ่มต้นจริงพึ่งพาrow_weightแต่เราจะไปที่หลังจากที่เราคิดออกว่าทำไม / เมื่อมีการตั้งค่าrow_weight0

การหาสาเหตุที่row_weightตั้งไว้เป็น0

ส่วนนี้ค่อนข้างง่ายที่จะขุดขึ้นมา ก้อนใหญ่ของการคำนวณการจัดส่งสินค้าเกิดขึ้นได้ในMage_Sales_Model_Quote_Address_Total_Shipping::collectรวมถึงการตั้งค่าrow_weightเพื่อ0:

public function collect(Mage_Sales_Model_Quote_Address $address)
{
    parent::collect($address);

    foreach ($items as $item) {
        /* Snip: Handling virtual items and parent items */

        if ($item->getHasChildren() && $item->isShipSeparately()) {
            /* Snip: Handling items with children */
        }
        else {
            if (!$item->getProduct()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
            $item->setRowWeight($rowWeight);
        }
    }

เหตุใดจึงไม่ส่งผลกระทบต่อผู้ให้บริการเริ่มต้นของ Magento

หากคุณค้นหา regex สำหรับ/row_?weight/i(เช่นgetRowWeight, setRowWeight, setData('row_weight')ฯลฯ ) ในMage_Shipping(ผู้ให้บริการง่าย) และMage_Usa (FedEx, UPS, และบางสายการบินอื่น ๆ ) ไม่มีอะไรปรากฏขึ้น ทำไม? เนื่องจากผู้ให้บริการเริ่มต้นใช้น้ำหนักที่อยู่ทั้งหมดไม่ใช่น้ำหนักของแต่ละรายการ

ตัวอย่างเช่นลองดูที่Mage_Usa_Model_Shipping_Carrier_Fedex::setRequest:

public function setRequest(Mage_Shipping_Model_Rate_Request $request)
{
    $this->_request = $request;

    $r = new Varien_Object();

    /* Snip */

    $weight = $this->getTotalNumOfBoxes($request->getPackageWeight());
    $r->setWeight($weight);
    if ($request->getFreeMethodWeight()!= $request->getPackageWeight()) {
        $r->setFreeMethodWeight($request->getFreeMethodWeight());
    }

และคำร้องขอรับน้ำหนักแพคเกจจากที่ไหน คำตอบคือMage_Sales_Model_Quote_Address::requestShippingRates:

public function requestShippingRates(Mage_Sales_Model_Quote_Item_Abstract $item = null)
{
    /** @var $request Mage_Shipping_Model_Rate_Request */
    $request = Mage::getModel('shipping/rate_request');
    /* Snip */
    $request->setPackageWeight($item ? $item->getRowWeight() : $this->getWeight());

เราสามารถเพิกเฉยต่อการใช้$item->getRowWeight()ที่นี่เพราะrequestShippingRatesถูกเรียกโดยไม่ต้องระบุรายการเป็นพารามิเตอร์ในMage_Sales_Model_Quote_Address_Total_Shipping::collect:

public function collect(Mage_Sales_Model_Quote_Address $address)
{
    parent::collect($address);

    foreach ($items as $item) {
        /* Snip: Handling virtual items and parent items */

        if ($item->getHasChildren() && $item->isShipSeparately()) {
            /* Snip: Handling items with children */
        }
        else {
            if (!$item->getProduct()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
            $item->setRowWeight($rowWeight);
        }
    }

    $address->setWeight($addressWeight);
    $address->setFreeMethodWeight($freeMethodWeight);

    $address->collectShippingRates();

สิ่งนี้ควรดูคุ้นเคยเนื่องจากสถานที่นี้เป็นสถานที่เดียวกับที่แต่ละรายการrow_weightถูกตั้งค่า0หากการจัดส่งฟรีมีผล สังเกตว่า$addressWeightผลรวมของแต่ละรายการมีอะไร$rowWeightบ้าง แต่ก่อนหน้าrow_weightนี้มีการตั้งค่าให้เป็น0อย่างไร

โดยทั่วไปน้ำหนักที่อยู่จะเป็นน้ำหนักรวมของรายการทั้งหมดโดยไม่คำนึงถึงfree_shippingมูลค่าของแต่ละรายการ เนื่องจากผู้ให้บริการเริ่มต้นของ Magento ใช้น้ำหนักที่อยู่เท่านั้นปัญหาที่เกิดขึ้นrow_weightจึงไม่ปรากฏ

แล้วทำไมเราถึงต้องการ row_weight

พวกเราต้องการ row_weightเพราะเราได้ปรับแต่งผู้ให้บริการ FedEx ของ Magento เพื่อคำนวณอัตราแยกต่างหากสำหรับรายการที่มาจากแหล่งกำเนิดที่แตกต่างกันแม้ว่าพวกเขาจะไปยังปลายทางเดียวกัน (และเป็นส่วนหนึ่งของที่อยู่เดียวกัน) ตัวอย่างเช่นหากคุณอาศัยอยู่ในนิวเจอร์ซีย์ราคาถูกกว่า (และเร็วกว่า) ในการจัดส่งรายการจาก NJ มากกว่าจาก CA - และหากคุณมีรายการจากทั้ง NJ และ CA ในการสั่งซื้อคุณจะเห็นต้นทุน (และโดยประมาณ) วันที่ส่งมอบ) ของการจัดส่งแต่ละครั้ง

โดยสรุปดูเหมือนว่าเราสามารถแก้ไขปัญหานี้ได้อย่างง่ายดายโดยการเพิกเฉยrow_weightและใช้งานweight * qtyโดยตรง แต่มันนำเราไปสู่:

คำถาม

ทำไมShippingยอดรวมของการตั้งค่าrow_weightของรายการเสนอราคาถึง0หากการจัดส่งฟรีมีผล? ดูเหมือนว่านี่จะไม่ถูกใช้งานได้ทุกที่

ข้อสังเกตเพิ่มเติม

ฉันละเลยที่จะพูดถึงว่าrow_weightจริงอาจจะไม่ใช่ศูนย์ แต่ก็ยังน้อยกว่าweight * qtyถ้าเป็นจำนวนที่แทนfree_shipping trueฉันถือว่าวัตถุประสงค์ของการนี้คือการให้วิธีแก้ปัญหากับสถานการณ์เช่นนี้:

ฉันมีสินค้าชนิดเดียวกัน 3 ชิ้นในรถเข็นสินค้าแต่ละชิ้นมีน้ำหนัก 2 ปอนด์ ฉันใช้คูปองจัดส่งฟรี แต่ จำกัด ไว้ที่ปริมาณ 2 ดังนั้นจึงใช้ได้กับ 2 รายการเท่านั้น ตอนนี้เมื่อฉันดูอัตราค่าจัดส่งฉันจะดูอัตราค่าจัดส่งเป็น 2 ปอนด์ (2 + 0 + 0) มากกว่า 6 ปอนด์ (2 + 2 + 2)

ดูเหมือนว่าจะสมเหตุสมผล แต่มีสองปัญหาที่สำคัญ:

  • ผู้ให้บริการวีโอไอพีที่เป็นค่าเริ่มต้นไม่ทำงานเช่นนี้ (ใช้น้ำหนักรวมที่อยู่ดูที่ด้านบน)

  • แม้ว่าผู้ให้บริการบางรายทำงานอย่างนี้ก็หมายความว่าฉันสามารถเลือกวิธีการจัดส่งใด ๆ (เช่นการจัดส่งข้ามคืน) และจ่ายเฉพาะค่าน้ำหนัก 1 รายการ - ความหมายผู้ขายจะต้องครอบคลุมค่าใช้จ่ายอีก 2 รายการ . มันขึ้นอยู่กับผู้ค้าว่าฉันจะจ่ายแค่ 1 ชิ้นเท่านั้นและจากนั้นจัดส่งอีก 2 รายการโดยใช้วิธีที่คุ้มค่ามากขึ้นสร้างความไม่ตรงกันระหว่างที่วีโอไอพีแสดงกับสินค้าจริง ส่งออกไปแล้ว


เฮ้ไม่มีผู้รับ? :)
Agop

โหวตขึ้นมากมายพูดคุยน้อยมาก! นั่นคือชีวิตของการพัฒนาวีโอไอพี
Agop

คำตอบ:


2

คิดว่าฉันจะแทงนี่ ... ;)

เป็นคำถามที่น่าสนใจทีเดียวที่คุณได้โพสต์ที่นี่ดังนั้นนี่คือสาเหตุที่ฉันคิดว่าพวกเขาทำ แต่ฉันยังคงพยายามติดตามเมื่อคดีนี้เกิดขึ้น

เมื่อเปรียบเทียบกับวิธีการของผู้ให้บริการ USPS ดูเหมือนว่าคำร้องขอระหว่างประเทศต่อ API ของพวกเขาจะให้น้ำหนักแยกสำหรับแต่ละผลิตภัณฑ์ นี่เป็นผู้ให้บริการรายเดียวที่ฉันสามารถค้นหาได้ ค้นหาวิธีการทั้งหมดด้านล่างและส่วนที่ไฮไลต์ด้านล่าง

protected function _formIntlShipmentRequest(Varien_Object $request)
    {
        $packageParams = $request->getPackageParams();
        $height = $packageParams->getHeight();
        $width = $packageParams->getWidth();
        $length = $packageParams->getLength();
        $girth = $packageParams->getGirth();
        $packageWeight = $request->getPackageWeight();
        if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
            $packageWeight = Mage::helper('usa')->convertMeasureWeight(
                $request->getPackageWeight(),
                $packageParams->getWeightUnits(),
                Zend_Measure_Weight::POUND
            );
        }
        if ($packageParams->getDimensionUnits() != Zend_Measure_Length::INCH) {
            $length = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getLength(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
            $width = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getWidth(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
            $height = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getHeight(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
        }
        if ($packageParams->getGirthDimensionUnits() != Zend_Measure_Length::INCH) {
            $girth = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getGirth(),
                $packageParams->getGirthDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
        }

        $container = $request->getPackagingType();
        switch ($container) {
            case 'VARIABLE':
                $container = 'VARIABLE';
                break;
            case 'FLAT RATE ENVELOPE':
                $container = 'FLATRATEENV';
                break;
            case 'FLAT RATE BOX':
                $container = 'FLATRATEBOX';
                break;
            case 'RECTANGULAR':
                $container = 'RECTANGULAR';
                break;
            case 'NONRECTANGULAR':
                $container = 'NONRECTANGULAR';
                break;
            default:
                $container = 'VARIABLE';
        }
        $shippingMethod = $request->getShippingMethod();
        list($fromZip5, $fromZip4) = $this->_parseZip($request->getShipperAddressPostalCode());

        // the wrap node needs for remove xml declaration above
        $xmlWrap = new SimpleXMLElement('<?xml version = "1.0" encoding = "UTF-8"?><wrap/>');
        $method = '';
        $service = $this->getCode('service_to_code', $shippingMethod);
        if ($service == 'Priority') {
            $method = 'Priority';
            $rootNode = 'PriorityMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        } else if ($service == 'First Class') {
            $method = 'FirstClass';
            $rootNode = 'FirstClassMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        } else {
            $method = 'Express';
            $rootNode = 'ExpressMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        }

        $xml->addAttribute('USERID', $this->getConfigData('userid'));
        $xml->addAttribute('PASSWORD', $this->getConfigData('password'));
        $xml->addChild('Option');
        $xml->addChild('Revision', self::DEFAULT_REVISION);
        $xml->addChild('ImageParameters');
        $xml->addChild('FromFirstName', $request->getShipperContactPersonFirstName());
        $xml->addChild('FromLastName', $request->getShipperContactPersonLastName());
        $xml->addChild('FromFirm', $request->getShipperContactCompanyName());
        $xml->addChild('FromAddress1', $request->getShipperAddressStreet2());
        $xml->addChild('FromAddress2', $request->getShipperAddressStreet1());
        $xml->addChild('FromCity', $request->getShipperAddressCity());
        $xml->addChild('FromState', $request->getShipperAddressStateOrProvinceCode());
        $xml->addChild('FromZip5', $fromZip5);
        $xml->addChild('FromZip4', $fromZip4);
        $xml->addChild('FromPhone', $request->getShipperContactPhoneNumber());
        if ($method != 'FirstClass') {
            if ($request->getReferenceData()) {
                $referenceData = $request->getReferenceData() . ' P' . $request->getPackageId();
            } else {
                $referenceData = $request->getOrderShipment()->getOrder()->getIncrementId()
                                 . ' P'
                                 . $request->getPackageId();
            }
            $xml->addChild('FromCustomsReference', 'Order #' . $referenceData);
        }
        $xml->addChild('ToFirstName', $request->getRecipientContactPersonFirstName());
        $xml->addChild('ToLastName', $request->getRecipientContactPersonLastName());
        $xml->addChild('ToFirm', $request->getRecipientContactCompanyName());
        $xml->addChild('ToAddress1', $request->getRecipientAddressStreet1());
        $xml->addChild('ToAddress2', $request->getRecipientAddressStreet2());
        $xml->addChild('ToCity', $request->getRecipientAddressCity());
        $xml->addChild('ToProvince', $request->getRecipientAddressStateOrProvinceCode());
        $xml->addChild('ToCountry', $this->_getCountryName($request->getRecipientAddressCountryCode()));
        $xml->addChild('ToPostalCode', $request->getRecipientAddressPostalCode());
        $xml->addChild('ToPOBoxFlag', 'N');
        $xml->addChild('ToPhone', $request->getRecipientContactPhoneNumber());
        $xml->addChild('ToFax');
        $xml->addChild('ToEmail');
        if ($method != 'FirstClass') {
            $xml->addChild('NonDeliveryOption', 'Return');
        }
        if ($method == 'FirstClass') {
            if (stripos($shippingMethod, 'Letter') !== false) {
                $xml->addChild('FirstClassMailType', 'LETTER');
            } else if (stripos($shippingMethod, 'Flat') !== false) {
                $xml->addChild('FirstClassMailType', 'FLAT');
            } else{
                $xml->addChild('FirstClassMailType', 'PARCEL');
            }
        }
        if ($method != 'FirstClass') {
            $xml->addChild('Container', $container);
        }
        $shippingContents = $xml->addChild('ShippingContents');
        $packageItems = $request->getPackageItems();
        // get countries of manufacture
        $countriesOfManufacture = array();
        $productIds = array();
        foreach ($packageItems as $itemShipment) {
                $item = new Varien_Object();
                $item->setData($itemShipment);

                $productIds[]= $item->getProductId();
        }
        $productCollection = Mage::getResourceModel('catalog/product_collection')
            ->addStoreFilter($request->getStoreId())
            ->addFieldToFilter('entity_id', array('in' => $productIds))
            ->addAttributeToSelect('country_of_manufacture');
        foreach ($productCollection as $product) {
            $countriesOfManufacture[$product->getId()] = $product->getCountryOfManufacture();
        }

        $packagePoundsWeight = $packageOuncesWeight = 0;
        // for ItemDetail
        foreach ($packageItems as $itemShipment) {
            $item = new Varien_Object();
            $item->setData($itemShipment);

            $itemWeight = $item->getWeight() * $item->getQty();
            if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
                $itemWeight = Mage::helper('usa')->convertMeasureWeight(
                    $itemWeight,
                    $packageParams->getWeightUnits(),
                    Zend_Measure_Weight::POUND
                );
            }
            if (!empty($countriesOfManufacture[$item->getProductId()])) {
                $countryOfManufacture = $this->_getCountryName(
                    $countriesOfManufacture[$item->getProductId()]
                );
            } else {
                $countryOfManufacture = '';
            }
            $itemDetail = $shippingContents->addChild('ItemDetail');
            $itemDetail->addChild('Description', $item->getName());
            $ceiledQty = ceil($item->getQty());
            if ($ceiledQty < 1) {
                $ceiledQty = 1;
            }
            $individualItemWeight = $itemWeight / $ceiledQty;
            $itemDetail->addChild('Quantity', $ceiledQty);
            $itemDetail->addChild('Value', $item->getCustomsValue() * $item->getQty());
            list($individualPoundsWeight, $individualOuncesWeight) = $this->_convertPoundOunces($individualItemWeight);
            $itemDetail->addChild('NetPounds', $individualPoundsWeight);
            $itemDetail->addChild('NetOunces', $individualOuncesWeight);
            $itemDetail->addChild('HSTariffNumber', 0);
            $itemDetail->addChild('CountryOfOrigin', $countryOfManufacture);

            list($itemPoundsWeight, $itemOuncesWeight) = $this->_convertPoundOunces($itemWeight);
            $packagePoundsWeight += $itemPoundsWeight;
            $packageOuncesWeight += $itemOuncesWeight;
        }
        $additionalPackagePoundsWeight = floor($packageOuncesWeight / self::OUNCES_POUND);
        $packagePoundsWeight += $additionalPackagePoundsWeight;
        $packageOuncesWeight -= $additionalPackagePoundsWeight * self::OUNCES_POUND;
        if ($packagePoundsWeight + $packageOuncesWeight / self::OUNCES_POUND < $packageWeight) {
            list($packagePoundsWeight, $packageOuncesWeight) = $this->_convertPoundOunces($packageWeight);
        }

        $xml->addChild('GrossPounds', $packagePoundsWeight);
        $xml->addChild('GrossOunces', $packageOuncesWeight);
        if ($packageParams->getContentType() == 'OTHER' && $packageParams->getContentTypeOther() != null) {
            $xml->addChild('ContentType', $packageParams->getContentType());
            $xml->addChild('ContentTypeOther ', $packageParams->getContentTypeOther());
        } else {
            $xml->addChild('ContentType', $packageParams->getContentType());
        }

        $xml->addChild('Agreement', 'y');
        $xml->addChild('ImageType', 'PDF');
        $xml->addChild('ImageLayout', 'ALLINONEFILE');
        if ($method == 'FirstClass') {
            $xml->addChild('Container', $container);
        }
        // set size
        if ($packageParams->getSize()) {
            $xml->addChild('Size', $packageParams->getSize());
        }
        // set dimensions
        $xml->addChild('Length', $length);
        $xml->addChild('Width', $width);
        $xml->addChild('Height', $height);
        if ($girth) {
            $xml->addChild('Girth', $girth);
        }

        $xml = $xmlWrap->{$rootNode}->asXML();
        return $xml;
    }

ส่วนเฉพาะ:

$packagePoundsWeight = $packageOuncesWeight = 0;
        // for ItemDetail
        foreach ($packageItems as $itemShipment) {
            $item = new Varien_Object();
            $item->setData($itemShipment);

            $itemWeight = $item->getWeight() * $item->getQty();
            if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
                $itemWeight = Mage::helper('usa')->convertMeasureWeight(
                    $itemWeight,
                    $packageParams->getWeightUnits(),
                    Zend_Measure_Weight::POUND
                );
            }
            if (!empty($countriesOfManufacture[$item->getProductId()])) {
                $countryOfManufacture = $this->_getCountryName(
                    $countriesOfManufacture[$item->getProductId()]
                );
            } else {
                $countryOfManufacture = '';
            }
            $itemDetail = $shippingContents->addChild('ItemDetail');
            $itemDetail->addChild('Description', $item->getName());
            $ceiledQty = ceil($item->getQty());
            if ($ceiledQty < 1) {
                $ceiledQty = 1;
            }
            $individualItemWeight = $itemWeight / $ceiledQty;
            $itemDetail->addChild('Quantity', $ceiledQty);
            $itemDetail->addChild('Value', $item->getCustomsValue() * $item->getQty());
            list($individualPoundsWeight, $individualOuncesWeight) = $this->_convertPoundOunces($individualItemWeight);
            $itemDetail->addChild('NetPounds', $individualPoundsWeight);
            $itemDetail->addChild('NetOunces', $individualOuncesWeight);
            $itemDetail->addChild('HSTariffNumber', 0);
            $itemDetail->addChild('CountryOfOrigin', $countryOfManufacture);

            list($itemPoundsWeight, $itemOuncesWeight) = $this->_convertPoundOunces($itemWeight);
            $packagePoundsWeight += $itemPoundsWeight;
            $packageOuncesWeight += $itemOuncesWeight;
        }

สำหรับฉันดูเหมือนว่าวีโอไอพีจะคำนวณน้ำหนักบรรจุภัณฑ์ตามน้ำหนักของสินค้าจริงและไม่ยกระดับน้ำหนักที่อยู่ ฉันสงสัยว่ารายการแพ็กเกจที่ส่งผ่านนั้นไม่มีน้ำหนักเป็นศูนย์หรือไม่เพราะนั่นจะนำไปสู่น้ำหนักของรายการปลอมโดยพิจารณาจากการตอบสนองของอัตราจะขึ้นอยู่กับข้อมูลน้ำหนักที่ไม่ดี

ถ่ายภาพในที่มืดได้


1

ฉันเคยถูกแทงด้วยสิ่งนี้และฉันก็พบสิ่งที่น่าสนใจในบรรทัดของรหัสนี้

$item->setRowWeight($rowWeight);

ได้รับการแนะนำในรุ่น 1.1.5 ก่อนหน้าที่จะเป็นเช่นนี้

Magento Mirror Import Magento Release 1.1.5 - Shipping.php

Magento Mirror Import Magento Release 1.1.1 - Shipping.php

            else {
            if (!$item->getProduct()->getTypeInstance()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
        }
    }

ความเข้าใจของฉันคือ Mage_Sales_Model_Quote_Address_Total_Shipping :: รวบรวมต้องคำนวณ / อัปเดต $ addressWeight และ $ freeMethodWeight

    $addressWeight      = $address->getWeight();
    $freeMethodWeight   = $address->getFreeMethodWeight();

และ $ item-> setRowWeight shod ไม่สามารถใช้งานได้ที่นี่เพราะเกี่ยวข้องกับรายการที่ไม่ได้มีการอ้างอิงและที่อยู่

เดิมพันของฉันคือว่านี่เป็นข้อผิดพลาด อาจเป็นเพราะ row_total ไม่เคยมีจุดประสงค์เพื่อใช้ในวิธีการจัดส่งซึ่งเป็นสาเหตุที่โมดูลเริ่มต้นไม่ได้ใช้งาน

ฉันไม่สามารถติดตามบันทึกการเปลี่ยนแปลงใด ๆ ที่สามารถอธิบายได้ว่าทำไมสิ่งนี้ถึงได้รับการแนะนำใน v 1.1.5

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