एक से अधिक स्टोर व्यू होने से एक ही ऑर्डर increment_id नंबर रेंज साझा करता है


13

क्या Magento को इस तरह से कॉन्फ़िगर किया जा सकता है, कि एक ही वेबसाइट के कई स्टोर व्यू एक ही ऑर्डर increment_idनंबर रेंज को साझा कर सकें ? और यदि हां, तो कैसे?

उदाहरण के लिए, इस तरह एक multistore सेटअप के साथ 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वर्तमान में अंतिम क्रम वृद्धि आईडी मानकर 1000123 है, कैसे प्राप्त करें:

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

एक ही इनवॉइस increment_idनंबर रेंज साझा करने और / या एक ही क्रेडिटमेमो increment_idनंबर रेंज साझा करने के लिए समान स्टोर व्यू के लिए एक ही प्रश्न जाता है ।

क्या Magento इस आउट-ऑफ-द-बॉक्स का समर्थन करता है?


@ एलेसेंड्रो-रोंची के मार्गदर्शन से मैंने इस तरह से समाधान लागू किया। gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e मेरे लिए बहुत अच्छा काम करता है।
माइकल

जवाबों:


5

मुझे लगता है कि यह काफी मुश्किल होगा। इंक्रीमेंट आईडी eav_entity_storeतालिका में संग्रहीत की जाती है और प्रत्येक दुकान में इसकी प्रविष्टि स्वयं होती है जिसे तब अपडेट किया जाता है जब एक ऑर्डर (और बोली, चालान आदि) बनाया जाता है। सभी स्टोरों को एक ही इन्क्रीमेंटर का उपयोग करने के लिए प्राप्त करने के लिए आपको किसी तरह इस तर्क को फिर से लिखना होगा ताकि यह डीबी में एक ही पंक्ति का उपयोग करे। साइट के अन्य क्षेत्रों पर इसका क्या प्रभाव पड़ सकता है, यह कुछ और है जिस पर विचार करने की आवश्यकता है।


मैं रिचर्ड से सहमत हूं।
सिल्वेन रेई

आप शायद सही हैं लेकिन इस कोड को चलाने से मेरे सभी चालान एक ही नंबर अनुक्रम का अनुसरण करते हैंMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
जे घोष

3

आप अपने मॉडल में कस्टम लॉजिक प्रदान करने वाले "ईवी / यूनिट_इंक्रिमेंट_न्यूमेरिक" क्लास को फिर से लिखकर ऑर्डर, शिपिंग, इनवॉइस और क्रेडिट मेमो इंक्रीमेंट मॉडल को ओवरराइड कर सकते हैं।

अपने स्वयं के तर्क प्रदान करने के तरीके को समझने के लिए पूर्वजों की कक्षाओं (Mage_Eav_Model_Entity_Increment_Numeric और Mage_Eav_Model_Entity_Increment_Abstract) पर एक नज़र डालें।

GetNextId () फ़ंक्शन को ओवरराइड करने के लिए आप $ एंटिटी टाइप कोड पैरामीटर की जाँच करके विभिन्न संस्थाओं के बीच अंतर कर सकते हैं।

एक और (अधिक आक्रामक) तरीका यह है कि "eav_entity_type" तालिका के "increment_model" कॉलम के मान को ओवरराइट करके (इंस्टॉल स्क्रिप्ट के माध्यम से) प्रत्येक इकाई प्रकार के लिए एक अलग वेतन वृद्धि मॉडल निर्दिष्ट किया जाए। व्यक्तिगत रूप से मैं ऊपर वर्णित "पुनर्लेखन" समाधान पसंद करता हूं।

ध्यान दें: वेतन वृद्धि आईडी में नवीनतम मैगेंटो संस्करणों में एक विशिष्ट बाधा है, ताकि आप एक ही प्रकार के दो अलग-अलग संस्थाओं के लिए एक ही वेतन वृद्धि स्टोर न कर सकें। दूसरे शब्दों में, आप एक ही वेतन वृद्धि आईडी के साथ दो अलग-अलग चालान नहीं कर सकते।

आशा करता हूँ की ये काम करेगा।


इस में देखा है, लेकिन मैं खोजने में असमर्थ हूँ getLastId()में Mage_Eav_Model_Entity_Increment_Numericया किसी अन्य वर्ग में या पदानुक्रम में इंटरफेस। Btw, यह स्वीकृत उत्तर होना चाहिए।
माइकल

अद्यतन: बस एहसास हुआ कि यह एक संपत्ति सेट Varien_Objectसे हैMage_Eav_Model_Entity_Type
माइकल

इसे इस तरह से लागू किया गया है: gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e
माइकल

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, कोई फर्क नहीं पड़ता कि यह वास्तव में किस स्टोर को देखता है।

यदि ऐसा कोई रिकॉर्ड मौजूद नहीं है, तो Magento एक, प्रयोग store_idऔर increment_prefixका निर्माण करता है 0

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, shipmentऔर creditmemo

हालांकि जागरूक रहें, कि मुझे increment_per_storeअभी तक कोई आधिकारिक दस्तावेज नहीं मिला। और यह कि आपको इसे कॉन्फ़िगर करने की अनुमति देने वाले Magento बैकएंड में कोई विकल्प नहीं है।

इसका मतलब यह हो सकता है या नहीं, कि यह आधिकारिक तौर पर इस्तेमाल करने के लिए नहीं सोचा गया है।

अपने जोखिम पार इस्तेमाल करें। यदि आपके परिवर्तन कहर बरपाते हैं, तो मुझे दोष न दें। आपको ^ ^ चेतावनी दी गई है


1

यह आउट-ऑफ-द-बॉक्स समर्थित नहीं है। मैं यह भी करना चाहता था कि एक बार एक ए / बी टेस्ट के लिए दूसरा स्टोरव्यू करने के लिए मूल स्टोर से एक ही इंक्रीमेंट_आईडी साझा करें।

मैंने checkout_submit_all_afterफायर किए जाने पर उन 2 नंबरों को सरल तरीके से मिलान करने की कोशिश की , लेकिन इसके साथ बहुत असहज महसूस किया, इसलिए मैंने इसे छोड़ दिया। मुझे लगता है कि अधिक स्टोरेज और बहुत सारे ट्रैफ़िक के साथ यह एक वास्तविक गड़बड़ी हो सकती है इसलिए आपको मैजेंटोस लॉजिक में गहरी खुदाई करनी होगी।


0

समाधान:

अलग-अलग देशों के लिए अलग-अलग ऑर्डर / इनवॉइस / क्रेडिटमेमो आदि ... नंबर रेंज काफी अच्छा है, जो अक्सर स्टोर समूह के स्तर पर होता है।

लेकिन स्टोर व्यू लेवल पर अलग-अलग नंबर रेंज होना एक बुरी बात है अगर आप अलग-अलग भाषाओं के लिए स्टोर व्यू का इस्तेमाल करते हैं, जो शायद 90% मामलों में किया जा सकता है।

सौभाग्य से यह उतना मुश्किल नहीं है जितना इस धागे में प्रस्तावित है:

हम क्या करने जा रहे हैं, हम स्टोर व्यू आईडी का उपयोग करने के बजाय डिफ़ॉल्ट स्टोर व्यू आईडी लाने के लिए कहते हैं । हम वर्तमान स्टोर दृश्य के लिए स्टोर समूह को हल करके ऐसा कर रहे हैं और इसकी डिफ़ॉल्ट स्टोर व्यू आईडी प्राप्त कर रहे हैं। तब एक विशिष्ट स्टोर समूह का प्रत्येक स्टोर दृश्य समान संख्या सीमा प्रारूप (डिफ़ॉल्ट स्टोर दृश्य से एक) का उपयोग करता है।

यह वर्ग बनाएं:

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

सभी क्रम_रूप पंक्ति का उपयोग एक ही वेतन वृद्धि तालिका पर किया जाता है उदाहरण 'क्रम_आर्डर_1' उदाहरण: अद्यतन sales_sequence_metaसेट sequence_table= 'अनुक्रम_ऑर्डर_1'। कहाँ meta_id = ?? ()

नोट: पिछली सभी उद्धरण और चालान संबंधित पंक्ति को खाली कर दें या इस तालिकाओं पर उच्चतम क्रम_दृश्य तालिका का उपयोग करें (क्रम_क्रम_1, अनुक्रम_क्रम_0, अनुक्रम_ऑर्डर_2)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.