具有多个商店视图共享相同的订单increment_id号范围


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当前的上一个订单增量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非常适合我。
迈克尔

Answers:


5

我以为这会很难。增量ID存储在eav_entity_store表中,毫不奇怪,每个商店都有其自己的条目,当创建订单(和报价,发票等)时,条目会更新。为了使所有存储使用相同的增量器,您将需要以某种方式重写此逻辑,以便它使用数据库中的同一行。这可能会对网站的其他区域产生什么影响,还需要考虑其他因素。


我同意理查德的观点。
SylvainRayé2013年

您可能是对的,但是运行此代码使我的所有发票都遵循相同的数字顺序Mage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh

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或任何其他类或接口的层次结构。顺便说一句,这应该是公认的答案。
迈克尔

更新:刚意识到这是Varien_ObjectMage_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 = 0eav_entity_store

如果不存在这样的记录,Magento将使用store_idincrement_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模式,比如orderinvoiceshipmentcreditmemo

但是请注意,我还没有找到任何官方文档increment_per_store。而且Magento后端没有选项可让您配置它。

这可能意味着也可能不意味着它不被正式使用。

使用风险自负。如果您的更改造成了严重破坏,请不要怪我。您已被警告^^


1

开箱即用不支持。我也想这样做一次,以使A / B测试的第二个storeview共享与原始商店相同的增量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)上使用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.