热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详解Magento2订单号生成机制

转载自万博云计算: https:www.magentocookie.compost-magento2-order-number-generation-mechanism.html 

转载自万博云计算: https://www.magentoCOOKIE.com/post-magento2-order-number-generation-mechanism.html

 

Magento2里的订单号,由 Quote 对象的reserveOrderId方法生成:

Magento\Quote\Model\Quote::reserveOrderId()

/**
* Generate new increment order id and associate it with current quote
*
* @return $this
*/
public function reserveOrderId()
{
if (!$this->getReservedOrderId()) {
$this->setReservedOrderId($this->_getResource()->getReservedOrderId($this));
}
else {
//checking if reserved order id was already used for some order
//if yes reserving new one if not using old one

if ($this->orderIncrementIdChecker->isIncrementIdUsed($this->getReservedOrderId())) {
$this->setReservedOrderId($this->_getResource()->getReservedOrderId($this));
}
}
return $this;
}

在用户提交订单时,会调用该方法。具体会存在三种情况:



  1. 如果 Quote 对象的 reserved_order_id 字段存在, 未被其他订单使用,则 reserved_order_id 字段保持不变



  2. 如果 Quote 对象的 reserved_order_id 字段存在,但是已经被别的订单使用了,则重新生成新的订单号



  3. 如果 Quote 对象的 reserved_order_id 字段为空,则生成新的订单号



如论哪种情况,在生成订单号的时候,都会调用 Magento\Quote\Model\ResourceModel\Quote::getReservedOrderId() 方法:

1 /**
2 * Get reserved order id
3 *
4 * @param \Magento\Quote\Model\Quote $quote
5 * @return string
6 */
7 public function getReservedOrderId($quote)
8 {
9 return $this->sequenceManager->getSequence(
10 \Magento\Sales\Model\Order::ENTITY,
11 $quote->getStoreId()
12 )
13 ->getNextValue();
14 }

该方法会根据 entity_type 和 store_id, 查询 sales_sequence_meta 表中记录的序号表表名:

对于 Default Store View, Store Id = 1:

select * from sales_sequence_meta where entity_type = "order" and store_id = 1;

查询结果如下:

可以看到订单序号表是 sequence_order_1

每次需要生成订单号时,会先在该表插入一条记录,再获取最新插入的值, 我们称这个值为序号

获得序号后,需要将该序号乘以递增步长再格式化为9位数字(不足9位用0补全)

 

还需要获取订单号递增步长、前缀和后缀:

select * from sales_sequence_profile where meta_id = 5;

查询结果如下:

递增步长 为 sales_sequence_profile 表中 step 的值,默认值为 1,也就是说默认情况下,新订单号每次递增1

前缀 为 sales_sequence_profile 表中 prefix 的值, 默认值为当前的 store id

后缀 为 sales_sequence_profile 表中 suffix 的值, 默认为空

如果想要修改订单号前缀、后缀,修改该表中对应记录即可

 

最后,在得到了订单序号、前缀、后缀后,通过公式

完整订单号 = 前缀 + 订单序号 + 后缀

就可以获得最终的订单号了

原文链接:https://www.magentoCOOKIE.com/post-magento2-order-number-generation-mechanism.html

 



推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
author-avatar
mizrke
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有