여러 상점보기에서 동일한 주문 increment_id 수 범위를 공유 함


13

동일한 웹 사이트의 여러 상점보기가 동일한 주문 increment_id번호 범위를 공유 할 수 있도록 Magento를 구성 할 수 있습니까 ? 그렇다면 어떻게?

예를 들어 다음과 같은 다중 저장소 설정을 사용하는 경우 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의 마지막 주문 증분 ID가 현재 1000123 이라고 가정하면 다음을 달성하는 방법입니다.

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

나는 이것이 매우 어려울 것이라고 상상했다. 증가 ID는 eav_entity_store테이블에 저장되며 당연히 각 상점에는 주문 (및 견적, 송장 등)이 작성 될 때 업데이트되는 자체 항목이 있습니다. 모든 점포가 동일한 증분기를 사용하게하려면 DB에서 동일한 행을 사용하도록이 논리를 다시 작성해야합니다. 이것이 사이트의 다른 영역에 미치는 영향은 고려해야 할 다른 것입니다.


리차드에 동의합니다.
Sylvain Rayé

당신은 아마 맞아하지만이 코드는 내 모든 송장은 같은 수의 순서를 따라 만든 실행Mage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
제이 고쉬

3

모델에서 사용자 정의 논리를 제공하는 "eav / entity_increment_numeric"클래스를 다시 작성하여 주문, 운송, 송장 및 대변 메모 증분 모델을 대체 할 수 있습니다.

자신의 논리를 제공하는 방법을 이해하려면 조상 클래스 (Mage_Eav_Model_Entity_Increment_Numeric 및 Mage_Eav_Model_Entity_Increment_Abstract)를 살펴보십시오.

대체 할 getNextId () 함수의 $ entityTypeCode 매개 변수를 확인하여 다른 엔티티 간 논리를 구별 할 수 있습니다.

또 다른 (보다 침습적 인) 방법은 설치 스크립트를 통해 "eav_entity_type"테이블의 "increment_model"열의 값을 덮어 써서 각 엔티티 유형에 대해 다른 증분 모델을 지정하는 것입니다. 개인적으로 위에서 언급 한 "다시 쓰기"솔루션을 선호합니다.

주의 : 증분 ID에는 최신 Magento 버전에서 고유 한 제약 조건이 있으므로 동일한 유형의 두 개의 다른 엔티티에 대해 동일한 증분 ID를 저장할 수 없습니다. 즉, 동일한 증분 ID를 가진 두 개의 다른 송장을 가질 수 없습니다.

도움이 되길 바랍니다.


이것으로 보았다하지만 난 찾을 수있어 getLastId()에서 Mage_Eav_Model_Entity_Increment_Numeric또는 다른 클래스 또는 계층 구조의 인터페이스. Btw, 이것은 허용되는 대답이어야합니다.
Michael

UPDATE : 그냥 그것이의 속성 세트입니다 실현 Varien_Object에서Mage_Eav_Model_Entity_Type
마이클


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_idand increment_prefixof를 사용하여 레코드를 만듭니다 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, shipmentcreditmemo.

그래도 공식 문서를 찾을 수 없다는 것을 명심하십시오. increment_per_store 아직 . 그리고 Magento 백엔드에는 옵션을 구성 할 수 없습니다.

이것은 공식적으로 사용되는 것으로 생각되지 않을 수도 있습니다.

자신의 책임하에 사용하십시오. 변경 사항이 혼란스러워도 나를 비난하지 마십시오. 경고를 받았습니다 ^^


1

기본적으로 지원되지 않습니다. 또한 A / B 테스트에 대한 두 번째 상점보기가 원래 상점과 동일한 incremental_id를 공유하도록이 작업을 한 번 수행하려고했습니다.

나는이 두 숫자를 checkout_submit_all_after해고 할 때 간단한 방법으로 일치 시키려고 했지만 매우 불편하다고 느꼈습니다. 더 많은 상점보기와 많은 트래픽으로 인해 실제 혼란이 발생할 수 있으므로 Magentos 논리를 더 깊이 파고 들어야합니다.


0

해결책:

주문 / 인보이스 / 신용 메모 등 번호 범위가 다른 것은 국가마다 다르며, 이는 대부분 상점 그룹 레벨에서 의미합니다.

그러나 상점보기 레벨에서 다른 숫자 범위를 갖는 것은 모든 경우의 90 %에서 수행 될 수있는 다른 언어에 대해 상점보기를 사용하는 경우 나쁜 것입니다.

운 좋게도이 글에서 제안한 것처럼 어렵지 않습니다 :

우리가 할 일은 메소드가 호출 된 상점보기 ID를 사용하는 대신 기본 상점보기 ID를 가져 오는 것입니다 . 현재 상점보기의 상점 그룹을 해결하고 기본 상점보기 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에서 사용 ... SELECT * FROM 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.