การมีหลายมุมมองร้านค้าจะแบ่งช่วงหมายเลข


13

Magento สามารถกำหนดค่าในลักษณะที่มุมมองหลายร้านในเว็บไซต์เดียวกันสามารถแบ่งปันincrement_idช่วงหมายเลขคำสั่งซื้อเดียวกันได้หรือไม่ และถ้าเป็นเช่นนั้นได้อย่างไร

ตัวอย่างเช่นด้วยการตั้งค่าแบบมัลติสโตร์เช่นนี้ในcore_store:

store_id        code    website_id    group_id
       0       admin             0           0
       1       alpha             1           1
       2       bravo             2           2
       3     charlie             2           2

ตอนนี้มุมมองร้านค้าใหม่deltaจะถูกเพิ่ม:

store_id        code    website_id    group_id
       4       delta             1           1

สมมติว่าalphaการเพิ่มคำสั่งซื้อล่าสุดในปัจจุบันคือ 1,000123 วิธีการบรรลุ:

next sell    order number
    alpha         1000124
    delta         1000125
    delta         1000126
    alpha         1000127

คำถามเดียวกันสำหรับมุมมองร้านค้าหลายแห่งที่แชร์increment_idช่วงหมายเลขใบแจ้งหนี้เดียวกันและ / หรือแบ่งปันincrement_idช่วงหมายเลขเครดิตเดียวกัน

Magento รองรับกล่องนอกกรอบนี้หรือไม่?


ด้วยคำแนะนำจาก @ alessandro-ronchi ฉันใช้วิธีแก้ปัญหาแบบนี้ gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e ใช้งานได้ดีสำหรับฉัน
Michael

คำตอบ:


5

ฉันคิดว่ามันจะค่อนข้างยาก รหัสที่เพิ่มขึ้นจะถูกเก็บไว้ในeav_entity_storeตารางและแต่ละร้านมีรายการของตัวเองซึ่งมีการปรับปรุงเมื่อมีการสร้างคำสั่งซื้อ (และใบเสนอราคาใบแจ้งหนี้ ฯลฯ ) หากต้องการให้ร้านค้าทั้งหมดใช้ส่วนเพิ่มเดียวกันคุณจะต้องเขียนตรรกะนี้ซ้ำดังนั้นจึงใช้แถวเดียวกันใน DB สิ่งที่มีผลกระทบต่อสิ่งนี้อาจส่งผลกระทบต่อส่วนอื่น ๆ ของเว็บไซต์เป็นอย่างอื่นที่ควรพิจารณา


ฉันเห็นด้วยกับริชาร์ด
Sylvain Rayé

คุณอาจถูกต้อง แต่การใช้รหัสนี้ทำให้ใบแจ้งหนี้ทั้งหมดของฉันเป็นไปตามลำดับหมายเลขเดียวกันMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh

3

คุณสามารถแทนที่รูปแบบการเพิ่มคำสั่งการส่งใบแจ้งหนี้และใบลดหนี้โดยการเขียนคลาส "eav / entity_increment_numeric" ใหม่โดยให้ตรรกะที่กำหนดเองในแบบจำลองของคุณ

ลองดูที่คลาสบรรพบุรุษ

คุณสามารถแยกความแตกต่างทางตรรกะระหว่างเอนทิตีที่แตกต่างกันโดยการตรวจสอบพารามิเตอร์ $ entityTypeCode ของฟังก์ชัน getNextId () ที่คุณจะแทนที่

อีกวิธีหนึ่ง (การบุกรุกมากกว่า) คือการระบุรูปแบบการเพิ่มที่แตกต่างกันสำหรับแต่ละประเภทเอนทิตีโดยการเขียนทับ (ผ่านสคริปต์การติดตั้ง) ค่าของคอลัมน์ "increment_model" ของตาราง "eav_entity_type" โดยส่วนตัวฉันชอบโซลูชัน "เขียนใหม่" ที่กล่าวถึงข้างต้น

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

หวังว่ามันจะช่วย


มองเข้าไปในนี้ แต่ฉันไม่สามารถหาgetLastId()ในMage_Eav_Model_Entity_Increment_Numericหรือในชั้นเรียนหรืออินเตอร์เฟซอื่น ๆ ในลำดับชั้น Btw นี่ควรเป็นคำตอบที่ยอมรับได้
ไมเคิล

ปรับปรุง: เพิ่งตระหนักว่ามันเป็นคุณสมบัติที่ตั้งอยู่บนVarien_ObjectจากMage_Eav_Model_Entity_Type
ไมเคิล

ดำเนินการดังนี้: gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e
Michael

2

ขณะขุดลึกฉันรู้ว่าeav_entity_type.increment_per_storeอาจเป็นประโยชน์

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

นี่ไม่ได้แก้ปัญหาเฉพาะของฉัน แต่อาจเป็นประโยชน์กับคนอื่นบ้างดังนั้นเราจะไปที่นี่:

เพื่อเปิดใช้งานร่วมกันทั่วโลกของตัวเลขการสั่งซื้อของคุณตั้งค่าeav_entity_type.increment_per_storeของการสั่งซื้อกิจการไป0,

สิ่งนี้นำไปสู่การMage_Eav_Model_Entity_Type::fetchNewIncrementId()ใช้store_id = 0เมื่อโหลดeav_entity_storeเร็กคอร์ดของเอนทิตีการสั่งซื้อไม่ว่าร้านค้าจะดูเป็นของจริง

หากไม่มีการบันทึกดังกล่าวอยู่, วีโอไอพีสร้างหนึ่งใช้store_idและของincrement_prefix0

public function fetchNewIncrementId($storeId = null)
{
    if (!$this->getIncrementModel()) {
        return false;
    }

    if (!$this->getIncrementPerStore() || ($storeId === null)) {
        /**
         * store_id null we can have for entity from removed store
         */
        $storeId = 0;
    }

    // Start transaction to run SELECT ... FOR UPDATE
    $this->_getResource()->beginTransaction();

    $entityStoreConfig = Mage::getModel('eav/entity_store')
        ->loadByEntityStore($this->getId(), $storeId);

    if (!$entityStoreConfig->getId()) {
        $entityStoreConfig
            ->setEntityTypeId($this->getId())
            ->setStoreId($storeId)
            ->setIncrementPrefix($storeId)
            ->save();
    }

    $incrementInstance = Mage::getModel($this->getIncrementModel())
        ->setPrefix($entityStoreConfig->getIncrementPrefix())
        ->setPadLength($this->getIncrementPadLength())
        ->setPadChar($this->getIncrementPadChar())
        ->setLastId($entityStoreConfig->getIncrementLastId())
        ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
        ->setStoreId($entityStoreConfig->getStoreId());

    /**
     * do read lock on eav/entity_store to solve potential timing issues
     * (most probably already done by beginTransaction of entity save)
     */
    $incrementId = $incrementInstance->getNextId();
    $entityStoreConfig->setIncrementLastId($incrementId);
    $entityStoreConfig->save();

    // Commit increment_last_id changes
    $this->_getResource()->commit();

    return $incrementId;
}

นี้จะทำงานสำหรับประเภทนิติบุคคลใด ๆ โดยใช้eav/entity_increment_numericรูปแบบเช่นorder, invoice, และshipmentcreditmemo

โปรดระวังด้วยว่าฉันยังไม่สามารถหาเอกสารอย่างเป็นทางการincrement_per_storeได้ และนั่นไม่มีตัวเลือกในแบ็กเอนด์วีโอไอพีที่ให้คุณกำหนดค่านี้

นี่อาจจะใช่หรือไม่ใช่หมายความว่าจะไม่คิดว่าจะใช้อย่างเป็นทางการ

ใช้ความเสี่ยงของคุณเอง หากการเปลี่ยนแปลงของคุณก่อความหายนะอย่าโทษฉัน คุณถูกเตือนแล้ว ^^


1

มันไม่ได้รับการสนับสนุนนอกกรอบ ฉันยังต้องการทำเช่นนี้อีกครั้งเพื่อให้มีการดูหน้าร้านครั้งที่สองสำหรับการทดสอบ A / B ร่วมกัน increment_id เดียวกันจากร้านเดิม

ฉันพยายามจับคู่ตัวเลขทั้งสองด้วยวิธีง่าย ๆ เมื่อcheckout_submit_all_afterถูกไล่ออก แต่รู้สึกไม่สบายใจกับมันมากดังนั้นฉันจึงทิ้งมัน ฉันเดาว่ามีหน้าร้านมากขึ้นและการรับส่งข้อมูลจำนวนมากซึ่งอาจส่งผลให้เกิดความยุ่งเหยิงอย่างแท้จริงดังนั้นคุณต้องขุดลึกลงไปในตรรกะของ Magentos


0

วิธีการแก้:

การมีใบสั่งซื้อ / ใบแจ้งหนี้ / creditmemo ที่แตกต่างกัน ฯลฯ ... ช่วงหมายเลขค่อนข้างดีสำหรับประเทศต่าง ๆ ซึ่งส่วนใหญ่มักจะหมายถึงในระดับกลุ่มร้านค้า

แต่การมีช่วงจำนวนที่แตกต่างกันในระดับมุมมองร้านค้าเป็นสิ่งที่ไม่ดีถ้าคุณใช้มุมมองร้านค้าสำหรับภาษาต่าง ๆ ซึ่งอาจทำได้ 90% ของทุกกรณี

โชคดีที่มันไม่ยากอย่างที่เสนอในหัวข้อนี้:

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

สร้างคลาสนี้:

class Funky_Module_Model_Entity_Type extends Mage_Eav_Model_Entity_Type
{
    /**
     * Retreive new incrementId
     *
     * @param int $storeId
     * @return string
     * @throws Exception
     */
    public function fetchNewIncrementId($storeId = null)
    {
        if (!$this->getIncrementModel()) {
            return false;
        }

        if (!$this->getIncrementPerStore() || ($storeId === null)) {
            /**
             * store_id null we can have for entity from removed store
             */
            $storeId = 0;
        }

        //FIX START:
        $groupId = Mage::getModel('core/store')->load($storeId)->getGroupId();
        $group =  Mage::getModel('core/store_group')->load($groupId);
        $storeId = $group->getDefaultStoreId();
        //FIX END:

        // Start transaction to run SELECT ... FOR UPDATE
        $this->_getResource()->beginTransaction();

        try {

            $entityStoreConfig = Mage::getModel('eav/entity_store')
                ->loadByEntityStore($this->getId(), $storeId);

            if (!$entityStoreConfig->getId()) {
                $entityStoreConfig
                    ->setEntityTypeId($this->getId())
                    ->setStoreId($storeId)
                    ->setIncrementPrefix($storeId)
                    ->save();
            }

            $incrementInstance = Mage::getModel($this->getIncrementModel())
                ->setPrefix($entityStoreConfig->getIncrementPrefix())
                ->setPadLength($this->getIncrementPadLength())
                ->setPadChar($this->getIncrementPadChar())
                ->setLastId($entityStoreConfig->getIncrementLastId())
                ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
                ->setStoreId($entityStoreConfig->getStoreId());

            /**
             * do read lock on eav/entity_store to solve potential timing issues
             * (most probably already done by beginTransaction of entity save)
             */
            $incrementId = $incrementInstance->getNextId();
            $entityStoreConfig->setIncrementLastId($incrementId);
            $entityStoreConfig->save();

            // Commit increment_last_id changes
            $this->_getResource()->commit();
        } catch (Exception $e) {
            $this->_getResource()->rollBack();
            throw $e;
        }

        return $incrementId;
    }

}

เพิ่มการเขียนนี้ใหม่เพื่อ config.xml ของโมดูลของคุณ:

<global>
   <models>
            <eav>
                <rewrite>
                     <entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
                </rewrite>
            </eav> 
    ...

หากคุณมีวิธีที่ดีกว่าโดยไม่ต้องเขียนกระจายความรู้ มีความสุข. อย่าแฮ็คคอร์


0

ใช้กับ magento2 ... เลือก * จาก sales_sequence_meta

แถว sequence_table ทั้งหมดจะถูกใช้ในตารางส่วนเพิ่มเดียวกันตัวอย่าง 'sequence_order_1' ตัวอย่าง: UPDATE sales_sequence_metaSET sequence_table= 'sequence_order_1' โดยที่ meta_id = ?? ()

หมายเหตุ: ล้างแถวที่เกี่ยวข้องกับการอ้างอิงและใบแจ้งหนี้ก่อนหน้านี้ทั้งหมดหรือใช้ในตาราง sequence_value สูงสุดในตารางนี้ (sequence_order_1, sequence_order_0, sequence_order_2)

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