一些商家希望自定义订单号或发票号,以使其与Magento 2默认情况下的产品号不同。他们可能希望数字包含更多信息,或者他们可能具有不应更改的现有格式。也许这些数字需要从上一个网站留下的地方中提取(或者看起来还不够漂亮)。这些数字每个都有一个增量ID,并且用于创建它们的值存储在数据库中,并且无法通过admin进行配置,因此我们将需要一些SQL来进行自定义。无需再费周折…
我们可以分别调整订单,发票,贷项通知单和装运的增量ID的以下属性:
- 前缀
- 后缀
- 步骤
- 起始值
- 填充
前缀,后缀,起始值和步骤存储在数据库中,而填充长度在代码中设置。在更改它们之前,让我们看看如何将它们全部用于生成增量ID:
一
在Magento 2中,确定增量ID的方法在中Magento\SalesSequence\Model\Sequence
。
该模式设置为:一个字符串,再加上一个9位数字(用0填充),再加上另一个字符串。
该getCurrentValue()
方法根据以下模式返回新的增量ID:前缀,加上方法的返回值calculateCurrentValue()
,加上后缀。在calculateCurrentValue()
返回主号:
return ($this->lastIncrementId - $this->meta->getActiveProfile()->getStartValue()) * $this->meta->getActiveProfile()->getStep() + $this->meta->getActiveProfile()->getStartValue();
为了演示起见,我们将使用订单的增量ID,因此数据库中表$this->lastIncrementId
的sequence_value
列中的最后一个值sequence_order_1
也是。(如果使用的是发票增量ID,$this->lastIncrementId
将来自sequence_invoice_1
表格。)1
表格名称中的名称是第一个商店视图的商店ID。如果您有另一个商店视图,则可以使用该sequence_order_n
表(这n
是您的商店ID)。
因此,从最后calculateCurrentValue()
减去,乘以,然后加。结果将添加到前缀和后缀之间。 我们可以将整个方法表示为一个数学公式:start_value
sequence_value
step
start_value
increment_id
= prefix
+((sequence_value
– – start_value
)* step
+ start_value
){填充到X
数字} +suffix
sequence_value
从1开始,并且在创建新订单(或发票等)时始终增加1。
最初,start_value
和和step
分别为1和prefix
和suffix
未定义。
如果将这些值插入公式,则可以预测初始订单增量ID:
increment_id
= ''
+((1
- 1
)* 1
+ 1
){填充到9位数字} + ''
增量ID =((1-1)* 1 +1){填充到9位数字}
增量ID = 1 {填充到9位数字}
增量ID = 000000001
(这与sales_order.increment_id
数据库中显示的一阶增量ID一致:000000001。)
前缀/后缀
前缀和后缀很简单。它们分别在增量ID号之前和后面附加存储在sales_sequence_profile.prefix
&中的值sales_sequence_profile.suffix
。更改前缀是延长增量ID或使其以0开头的简单方法。后缀可用于添加0,以使数字每次看起来增加10或100(例如)。另外,我们可以使用这些值来设置增量ID的样式或使其专有,因此在这种情况下,我们只需添加一个前缀“ CL-”,并使用“ -M2”作为后缀。
(当我们创建下一个顺序,sequence_order_1.sequence_value
从1增加到2,但start_value
并step
仍然各自是1)
将其插入我们的公式中:
increment_id
= prefix
+((sequence_value
– – start_value
)* step
+ start_value
){填充到X
数字} + suffix
增量ID ='CL-'+((2-1)* 1 +1){填充到9位数字} +'-M2'
增量ID ='CL -'+ 2 {填充为9位数字)+'
-M2'增量ID ='CL-000000002-M2'
(当我们创建此订单时,最后一行sales_order.increment_id
应与我们的计算一致。)
二
步骤存储在中sales_sequence_profile.step
。默认情况下为1,并且不得小于1。
我们可以使用它在每次创建新订单(或“逐步增加”)时将订单增量ID号增加一定数量。例如,因为step
默认情况下为1 ,所以我们的最后一个增量ID号从000000001 “递增” 到000000002。但是,当我们更改步长时,增量ID在遵循新模式之前将“洗牌”一次。
为了演示,我们将步长设置为100。(创建下一个订单时,sequence_order_1.sequence_value
从2增加到3,但start_value
仍然为1。)
插入:
increment_id
= prefix
+((sequence_value
– – start_value
)* step
+ start_value
){填充到X
数字} + suffix
增量ID ='CL-'+((3-1)* 100 +1){填充到9位数字} +'-M2'
增量ID ='CL -'+ 201 {填充为9位数字)+'
-M2'增量ID ='CL-000000201-M2'
如您所见,增量ID号没有从上一个值(000000002)“增加” 100 。这是因为它在第一个更改时会改组。但是,下一个增量ID应该遵循新的模式。(下一个顺序sequence_value
从3增加到4。)
增量ID ='CL-'+((4 – 1)* 100 +1){填充至9位数字} +'-M2'
增量ID ='CL-'+ 301 {填充至9位数字} +'-M2'
增量ID ='CL-000000301-M2'
这次,增量ID号如我们希望的那样(从000000201到000000301)从上一个值“增加”了100个。
起始值
起始值存储在中sales_sequence_profile.start_value
。默认情况下,它是1,并且不能小于0。(此外,它不应同时大于last sequence_value
和小于step
,因为这会使增量ID号为负。)
起始值的命名有点不直观,例如它会减少step
乘以的数量,然后加回到增量ID号上。例如,因为start_value
默认情况下为1 ,所以我们的最后两个增量ID号(000000201和000000301)实际上将1加到step
值的倍数(即100)上。
当我们更改起始值时,增量ID将“移动”一次,然后再次遵循该模式。为了演示,我们将使用3的起始值。(当我们创建下一个订单时,sequence_order_1.sequence_value
从4增加到5,step
仍然是100。)
当我们插入它时:
increment_id
= prefix
+((sequence_value
– – start_value
)* step
+ start_value
){填充到X
数字} + suffix
增量ID ='CL-'+((5 – 3)* 100 + 3){填充到9位数字} +'-M2'
增量ID ='CL -'+ 203 {填充至9位数字)+'
-M2'增量ID ='CL-000000203-M2'
如您所见,step
乘以的数量减少了,增加到增量ID号末尾的数量增加了(而不是从000000301到000000401的“步进” ,而是“转移”到000000203)。
下一个增量ID应该照常“增加”。(下一个顺序sequence_value
从5增加到6。)
增量ID ='CL-'+((6 – 3)* 100 + 3){填充至9位数字} +'-M2'
增量ID ='CL-'+ 303 {填充至9位数字} +'-M2'
增量ID ='CL-000000303-M2'
这次,增量ID号按预期“增加”,并且将起始值3添加到末尾。
(如果此更改似乎是设置增量ID的一种不寻常的方法,请不必担心。其目的只是演示如何start_value
影响模式。)
最小增量ID号
如果我们要设置一个“起始”数字,以使其看起来增量ID最初大于1,然后从那里开始递增计数(例如,为您的第一张银行支票编号1000),则实际上不会使用该start_value
属性。(但是,由于它具有该名称,因此在本节中解决该问题似乎很有帮助。)
要为增量ID设置一个最小数字,我们需要在中添加一个值sequence_order_1.sequence_value
。
为了演示,让我们添加一个sequence_value
1006,把step
和start_value
回1(当我们创建一个订单,sequence_order_1.sequence_value
增加1006至1007年,并step
和start_value
现在另1)。
根据公式:
increment_id
= prefix
+((sequence_value
– – start_value
)* step
+ start_value
){填充到X
数字} + suffix
增量ID ='CL-'+(((1007 – 1)* 1 + 1){填充到9位数字)+'-M2'
增量ID ='CL -'+ 1007 {填充为9位数字)+'
-M2'增量ID ='CL-000001007-M2'
现在,好像一阶增量ID是1000,我们从那里开始“上一步”。
注意:这些sequence_order
表都有一个AUTO_INCREMENT
值,因此,只有在插入的sequence_value
值高于上一个方法的情况下,以上方法才有效。如果尝试以这种方式缩短订单ID失败,则应检查AUTO_INCREMENT
相关序列表的值:
SHOW CREATE TABLE sequence_order_1;
如果AUTO_INCREMENT
返回的查询中的值大于sequence_value
您想要更改的数字,则需要运行如下查询:
ALTER TABLE sequence_order_1 AUTO_INCREMENT = 1006;
增量ID号的填充长度在代码库中确定,并且不受任何数据库属性的影响。
在中\Magento\SalesSequence\Model\Sequence
,该getCurrentValue()
方法使用格式化字符串打印功能来设置增量ID号的模式:
return sprintf(
$this->pattern,
$this->meta->getActiveProfile()->getPrefix(),
$this->calculateCurrentValue(),
$this->meta->getActiveProfile()->getSuffix()
);
“ $ this-> pattern”来自常量DEFAULT_PATTERN
,其最初为:%s%'.09d%s
。
增量ID号由中间部分确定:%'.09d
。在'.0
设定“0”作为填充字符和集的数字来显示为下面的值,在这种情况下是多少9
。该d
表现为[签字]十进制数。这意味着默认情况下,增量ID号将是带有9位数字的带符号十进制,并以0填充。为了演示,我们将填充长度设置为6。(创建下一个订单时,sequence_order_1.sequence_value
从1007增加到1008,而start_value
和step
仍然为1。)
使用我们的公式:
increment_id
= prefix
+((sequence_value
– – start_value
)* step
+ start_value
){填充到X
数字} + suffix
增量ID ='CL-'+(((1008 – 1)* 1 + 1){填充到6位数字)+'-M2'
增量ID ='CL -'+ 1008 {填充为6位数字)+'
-M2'增量ID ='CL-001008-M2'
如您所见,增量ID号现在只有6位数字,而不是9位数字。
实现它
在数据库中,该sales_sequence_profile
表列出对于每个实体类型(增量ID图案order
,invoice
,creditmemo
,和shipment
在每个商店视图)。我们需要对存储视图1(位于第5-8行)进行更改。(这些行分别设置了4种实体类型。)为了演示起见,我们将使用订单增量ID,因此将更改sales_sequence_profile
(meta_id = 5
)的第5行。
下面是sales_sequence_profile
看起来像默认情况下:
以下是将每个属性设置为示例中使用的值的SQL查询(以及代码行)。(由于我们使用了订单的增量ID,因此meta_id
以下每个查询中的都设置为5,但是您也可以使用6、7或8分别更改发票,Creditmemos和出货量的增量ID。)
前缀
UPDATE `sales_sequence_profile` SET `prefix` = 'CL-' WHERE `meta_id` = 5;
后缀
UPDATE `sales_sequence_profile` SET `suffix` = '-M2' WHERE `meta_id` = 5;
步骤
UPDATE `sales_sequence_profile` SET `step` = 100 WHERE `meta_id` = 5;
起始值
UPDATE `sales_sequence_profile` SET `start_value` = 3 WHERE `meta_id` = 5;
最小值
INSERT INTO `sequence_order_1` (`sequence_value`) VALUES ('1000');
填充
在第19行的/vendor/magento/module-sales-sequence/Model/Sequence.php中DEFAULT_PATTERN
设置常量。 我们可以通过创建以下内容在自定义模块中对其进行更改:
etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\DB\Sequence\SequenceInterface">
<arguments>
<argument name="pattern" xsi:type="string">%s%'.06d%s</argument>
</arguments>
</type>
</config>
结论
现在,您可以完全控制自己的增量ID。尽管当您调整某些值时它们有时似乎会发生意外变化,但公式应有助于您预测模式:
increment_id
= prefix
+((sequence_value
– – start_value
)* step
+ start_value
){填充到X
数字} +suffix